1. 程式人生 > >Linux下C程式動態庫的生成和呼叫

Linux下C程式動態庫的生成和呼叫

Linux下C程式動態庫的生成和呼叫

文章目錄

1 動態庫的打包和呼叫

下面以一個例子說明。
例如:

動態庫的特點是:一堆目標檔案的打包,連結時依賴,執行時依賴。
命令:
gcc -c func1.c func2.c main.c # 生成對應的目標檔案, 適用於動態庫編譯
gcc -shared -fpic -olibfunc.so func1.o func2.o # 動態庫打包,-fPIC: 生成與位置無關的程式碼
gcc main.o -otest -lfunc -L. # 最終連結 -L 指出動態庫路徑 -l 指出動態庫名稱

2 靜態庫打包和呼叫

靜態庫的特點是:一堆目標檔案的歸檔檔案,連線時依賴,執行時不依賴。
命令:
gcc -c func1.c func2.c main.c # 生成對應的目標檔案
ar -rcs libfunc.a func1.o func2.o # 靜態庫打包
gcc main.o -otest -lfunc -L. # 最終連結,與動態庫的連結方法一樣,優先進行動態庫連結,可以增加 -static 選項,強制進行靜態庫連結

3 常用命令

nm 庫名: 檢視庫中函式
ldd EXEC: 檢視程式執⾏所需要的動態庫

4 gcc 和 g++ 區別

兩者都可以編譯c++檔案,區別在於:
1)不論*.c還是*.cpp, g++都能夠在編譯時找到c++標準標頭檔案和庫檔案, 而gcc根據檔案字尾名決定是否將c++標準標頭檔案引入
即,一個c++原始檔不論是*.c還是*.cpp, 用g++都能夠編譯成功,而如果一個c++原始檔是*.c檔案則用gcc編譯,則會提示找不到c++標準標頭檔案和庫檔案。
2)編譯的規則不同,對函式名的“翻譯”規則不同。

5 編譯和連結的理解

1)一個原始檔需要呼叫第三方庫檔案,在將該檔案“編譯彙編”(gcc -c)生成目標檔案時,只需要第三方庫的標頭檔案,在最終生成可執行程式時連結,才需要第三方庫的動態庫檔案(*.so), 即,編譯生成目標檔案只需要所引用的函式的宣告。
2)app需要連結A庫,而A庫又需要連結B庫,則B庫只需要連結一次。庫只需要連結一次。