簡(jiǎn)介
- Linux環(huán)境下c++代碼打包成so
- Linux環(huán)境下so庫的使用
這里還是使用我們之前的Socket示例的代碼:

content.png
socketLib項(xiàng)目打包so文件
這里我們主要看Makefile文件
libmysocket.so : XTcp.cpp XThread.h XTcp.h
g++ -fPIC -shared -lpthread -o $@ $+ -std=c++0x
.PHONY : clean
clean :
-rm libmysocket.so
-
-fPIC參數(shù) -
-shared參數(shù)
執(zhí)行make后會(huì)在當(dāng)前目錄下生成libmysocket.so。so文件的命名規(guī)則是lib+定義的文件名+.so。
sockUseLib 項(xiàng)目如何使用so
先說明兩個(gè)項(xiàng)目都在/code目錄下。我們還是重點(diǎn)看Makefile文件
main : main.cpp
g++ -I/code/socketLib -L/code/socketLib -lmysocket -o $@ $+
.PHONY : clean
clean :
-rm main
這里重點(diǎn)在與-I和-L參數(shù)。在前面gcc編譯參數(shù)中我們講到-I指的是頭文件的搜索目錄,-L是動(dòng)態(tài)庫的搜索目錄。
這里我們就成功的進(jìn)行了編譯。
然后運(yùn)行./main發(fā)現(xiàn)報(bào)錯(cuò)
./main: error while loading shared libraries: libmysocket.so: cannot open shared object file: No such file or directory
這句話的意思是找不到libmysocket.so這個(gè)動(dòng)態(tài)庫文件。雖然我們鏈接成功了。但是運(yùn)行時(shí)候找不到動(dòng)態(tài)庫。這里有幾個(gè)方法:
- 臨時(shí)修改環(huán)境變量
只對(duì)當(dāng)前的shell有效
export LD_LIBRARY_PATH=/code/socketLib
關(guān)于LD_LIBRARY_PATH可參考Linux環(huán)境變量
- 修改用戶環(huán)境變量
只對(duì)當(dāng)前用戶有效
將export LD_LIBRARY_PATH=/code/socketLib添加到~/.bashrc的末尾。然后source ~/.bashrc