如何在linux的gcc中新增c語言的外部連結庫(“比如說,math.h"
庫是預編譯的目標檔案(object files)的集合,它們可被連結程序序。靜態庫以後綴為‘.a’的特殊的存檔檔案(archive file)儲存。
標準系統庫可在目錄 /usr/lib 與 /lib 中找到。比如,在類 Unix 系統中 C 語言的數學庫一般儲存為檔案/usr/lib/libm.a。該庫中函式的原型宣告在標頭檔案 /usr/include/math.h 中。C 標準庫本身儲存為/usr/lib/libc.a,它包含 ANSI/ISO C 標準指定的函式,比如‘printf’。對每一個 C 程式來說,libc.a 都預設被連結。
下面的是一個呼叫數學庫 libm.a 中 sqrt函式的的例子,建立檔案ctest3.c
#include<stdio.h>
#include<math.h>
main()
{
long int i,x,y;
for(i=1;i<100000;i++)
{
x=sqrt(i+100);
y=sqrt(i+268);
if(x*x==i+100&&y*y==i+268)
printf("\n%ld\n",i);
}
}
嘗試單獨從該檔案生成一個可執行檔案將導致一個連結階段的錯誤:
[email protected]:~/han# gcc -o ctest3 ctest3.c
/tmp/ccGWSm28.o: In function `main':
ctest3.c:(.text+0x3c): undefined reference to `sqrt'
ctest3.c:(.text+0x75): undefined reference to `sqrt'
collect2: ld returned 1 exit status
函式 sqrt,未在本程式中定義也不在預設庫‘libc.a’中;除非被指定,編譯器也不會連結‘libm.a’。
為使編譯器能將sqrt連結進主程式‘ctest3.c’,我們需要提供數學庫‘libm.a’。函式庫‘libm.a’包含所有數學函式的目標檔案,比如sin,cos,exp,log及sqrt。連結器將搜尋所有檔案來找到包含 sqrt的目標檔案。它的具體位置在/usr/lib檔案目錄下。
編譯器為連結函式庫提供了快捷的選項‘-l’。例如,下面的命令
gcc -lm -o ctest3 ctest3.c
與我們上面指定庫全路徑‘/usr/lib/libm.a’的命令等價。
輸出結果為:
[email protected]:~/han# ./ctest3
21
261
1581
一般來說,選項 -lNAME使連結器嘗試連結系統庫目錄中的函式庫檔案 libNAME.a。一個大型的程式通常要使用很多 -l選項來指定要連結的數學庫,圖形庫,網路庫等。
相關推薦
如何在linux的gcc中新增c語言的外部連結庫(“比如說,math.h"
庫是預編譯的目標檔案(object files)的集合,它們可被連結程序序。靜態庫以後綴為‘.a’的特殊的存檔檔案(archive file)儲存。 標準系統庫可在目錄 /usr/lib 與 /lib 中找到。比如,在類 Unix 系統中 C 語言的數學庫一般儲存為
JNA呼叫C語言動態連結庫學習實踐總結(指標模擬)
最新因為專案需要,學習了一下JNA框架,在這裡記錄一下學習和使用心得,給大家分享,希望能幫助新手。 本文主要講解如何使用JNA框架輕鬆呼叫C語言動態連結庫,如何使用JNA模擬C語言引數(例如陣列、指標等)。 JNA(Java Native Access)框架
JNA呼叫C語言動態連結庫學習實踐總結
2.JNA模擬普通傳值引數 C語言函式: int function1(int a, float b, long c) JNA模擬: int function1(int a, float b, long c) 3.JNA模擬C語言陣列 C語言函式:
UNIX下C語言動態連結庫SO
# # makefile for application preconsole program # # .SUFFIXES:.c .SUFFIXES:.cpre SYBA
C語言動態連結庫DLL的載入
靜態連結庫在連結時,編譯器會將 .obj 檔案和 .LIB 檔案組織成一個 .exe 檔案,程式執行時,將全部資料載入到記憶體。 如果程式體積較大,功能較為複雜,那麼載入到記憶體中的時間就會比較長,最直接的一個例子就是雙擊開啟一個軟體,要很久才能看到介面。這是靜態連結庫的一個弊端。 動態連結庫有兩種載入方
資料結構-c語言實現連結串列的建立,增刪,翻轉
很經典的課題了,這裡直接給出源程式: #include <stdio.h> #include <stdlib.h> #define LIST_MAX_LEN 10 typedef int ElementType; typedef int BOOL; #define TR
C語言實現連結串列的建立,初始化,插入,刪除,查詢
#include <stdio.h> #include <stdlib.h> #define OK 0 #define ERROR -1 #define MALLOC_ERROR -2 typedef int
c語言五大記憶體分割槽-(堆,棧,全域性/靜態儲存區,自由儲存區,程式碼區)與可執行程式的三段-(Text段,Date段,Bss段)
一、c語言五大記憶體分割槽 棧區(stack):存放函式形參和區域性變數(auto型別),由編譯器自動分配和釋放 堆區(heap):該區由程式設計師申請後使用,需要手動釋放否則會造成記憶體洩漏。如果程式設計師沒有手動釋放,那麼程式結束時可能由OS回收。
eclipse下生成dll連結庫(實測,附圖)
dll連結庫是windows環境下的動態連結庫,其內容可以為C/C++程式組成,其原理與linux環境下的so庫大同小異。 想要生成dll庫首先需要配置eclipse的開發環境,首先你需要個CDT元件
【C程式】JSON庫怎麼用,json.h全解
標頭檔案:#include "json/json.h" // 當前目錄下使用:char *str = "{\"abc\": 123, \"wds\": 12.3, \"qwe\": \"ddd\", \"bool0\": false, \"bool1\": true,
C語言實驗計算時間差(小時,分鐘,秒)
C語言實驗計算時間差(小時,分鐘,秒,只適用於同一天內) ```c #include <stdio.h> int main() { int hour1,min1,s1,ss1; int hour2,min2,s2,ss2; int
C語言常用函式庫中函式
1.pow(x,y);求x的y次方; 2.strstr(str1,str2);判斷str2是否為str1的子串,若是返回首次出現的位置,若不是返回NULL; 3.strcat(char* dest, const char *src);字串剪接函式,將src接
在ROS中呼叫外部連結庫檔案(.so)配置方法
舉例說明吧: 1、建立檔案樹如下: myproject: -include --Interface.h -lib --libInterface.so -src --control.cpp
Codeblocks建立和呼叫DLL動態連結庫(C語言)
建立一個最簡單的只有一個get_id() 函式的DLL庫 一、建立C語言動態連結庫 1.新建一個動態庫的工程 File - New - Project - DLL - Go 新建的工程原來的main.cpp和main.h刪除,新建兩個檔案simple.h, simple
C# 呼叫 C++ dll 動態連結庫中多個函式時全域性變數的問題
最近編寫C#程式呼叫C++語言的演算法庫,自己嘗試在C++中封裝好DLL庫,並在一個工程檔案中同時匯出多個函式供C#呼叫。多個函式之間需要相互通訊,但又不能互相呼叫,,一個很好的方法就是用全域
VS2015及VS2017組合語言呼叫C語言的stdio庫中的函式
眾所周知,VS可以用來寫組合語言,同樣的在組合語言中,我們可以呼叫C語言中的函式,前提我們需要知道呼叫的函式在哪裡。例如下面這一段程式碼:;//VS15/17 Template for Win32 Console Application.686.MODEL flat, std
python中呼叫動態連結庫(C++,linux)
1,建立並編譯C++程式 #include <fstream> #include <assert.h> #include <malloc.h> #incl
JSON的簡單介紹以及C語言的JSON庫使用
編程 delet 逗號 緩沖區 tdi 以及 and 項目 占用 JSON概述 JSON: JavaScript 對象表示法( JavaScript Object Notation) 。是一種輕量級的數據交換格式。 它基於ECMAScript的一個子集。 JSON采
linux中編譯C語言程序
編輯器 ins spa include all 運行程序 gcc linux中 style 1.首先安裝gcc編輯器 yum install gcc* -y 2.編寫C語言程序 [[email protected]/* */ ~]# vim aa.c #i
C語言數據庫數據類型
適配器 偏移 生成 包含 建數據庫 decimal create prim 包括 ??數據類型是一種屬性,用於指定對象可保存的數據的類型,SQL Server中支持多種數據類型,包括字符類型、數值類型以及日期類型等。數據類型相當於一個容器,容器的大小決定了裝的東西的多少,將