- 編譯與位置無關的代碼,生成.o,關鍵參數
-fPIC
createlibso目錄下
├── cheng.c
├── chu.c
├── head
│ └── test.h
├── jia.c
└── jian.c
gcc -fPIC -c *.c -I ./head
在createlibso目錄下生成 與位置無關的.o文件
├── cheng.c
├── cheng.o
├── chu.c
├── chu.o
├── head
│ └── test.h
├── jia.c
├── jian.c
├── jian.o
└── jia.o
- 將.o文件打包, 關鍵參數
-shared
gcc -shared *.o -o libjjcc.so
生成 動態庫 libjjcc.so動態庫文件
- 將庫文件與頭文件一起發布
在testlibso目錄下
├── head
│ └── test.h
├── lib
│ └── libjjcc.so
└── main.c
- 編譯出可執行程序(按照視頻教程來, 等再按照另一方法)
gcc main.c -L ./lib -l jjcc -I ./head -o useSOapp
- 解決不能加載動態庫的的問題
a. 拷貝到 /lib 目錄下,或者在/lib目錄下建立so文件的鏈接(不推薦)
b. 將庫路徑增加到環境變量 LD_LIBRARY_PATH中(不推薦, 且是一次性的,退出當前終端就不生效了,要想一直有效,要修改 ~/.bashrc 里面的內容 ,就是將exprot..追加進去)
比如課程中是這樣的, 圖下所示,是以追加的形式修改環境變量的
c. 配置 /etc/ld.so.conf文件,增加 庫路徑,并執行 sudo ldconfig -v
動態庫內存使用模型
PS:
1、LIBRARY_PATH:環境變量用于在程序編譯期間查找動態鏈接庫時指定查找共享庫的路徑.
指定gcc編譯需要鏈接動態鏈接庫的目錄。設置libtest1和libtest2目錄
# export LIBRARY_PATH=libtest1:libtest2:$LIBRARY_PATH //或寫入:/etc/profile配置文件中# gcc *.c -L./libtest1 -L./libtest2 -ltest1 -ltest2 //編譯時分別鏈接libtest1目錄下的libtest1.so庫與libtest2目錄的libtest2.so庫。
2、LD_LIBRARY_PATH:環境變量用于在程序運行期間查找動態鏈接庫時指定除了系統默認路徑(/usr/lib)之外的路徑.
可執行文件運行程序之前執行:
# export LD_LIBRARY_PATH=libtest1:libtest2:$LD_LIBRARY_PATH //或寫入:/etc/profile配置文件中# ./program //運行可執行程序