源文件:windows
//world.cpp #include <stdio.h> void world(void) { printf("world.\n"); }
//hello.cpp #include <stdio.h> void world(void); void hello(void) { printf("hello\n"); world(); }
//test.cpp void hello(void); int main(void) { hello(); return 0; }
1、動態庫多重依賴spa
(1)編譯word動態庫3d
g++ -shared -fPIC world.cpp -o libworld.socode
(2)編譯hello動態庫blog
g++ -shared -fPIC hello.cpp -o libhello.soio
ldd libhello.so編譯
查看libhello.so的依賴庫,沒有看到依賴libword.soclass
g++ -shared -fPIC hello.cpp -o libhello.so -L ./ -lworldtest
ldd libhello.sobfc
再次查看libhello.so的依賴庫,看到了依賴庫libword.so
上圖顯示libworld.so not found,若是臨時增長連接動態庫的路徑,輸入以下命令
export LD_LIBRARY_PATH=./
ldd libhello.so
查看libhello.so的依賴庫,顯示了依賴庫libword.so的路徑
先清除連接動態庫路徑
export LD_LIBRARY_PATH=
(3)編譯可執行文件test
g++ test.cpp -o a.out -L ./ -lhello
提示找不到libhello.so的依賴庫libworld.so,即便編譯libhello.so時已經指定了libworld.so,這點和windows不同
g++ test.cpp -o a.out -L ./ -lhello -lworld -Wl,-rpath ./
編譯經過,獲得可執行文件a.out,運行成功
2、動態庫靜態庫多重依賴
(1)編譯word靜態庫
g++ -c world.cpp
ar -cr libworld.a world.o
(2)編譯hello動態庫
g++ -shared -fPIC hello.cpp -o libhello.so -L ./ -lworld
編譯報錯,由於world也必須使用-fPIC,從新編譯
(3)編譯可執行文件
g++ test.cpp -o a.out -L ./ -lhello -Wl,-rpath ./
3、靜態庫多重依賴
(1)編譯world靜態庫
g++ -c world.cpp
ar -cr libworld.a world.o
(2)編譯hello靜態庫
g++ -c hello.cpp
ar -cr libhello.a hello.o
(3)編譯可執行文件
g++ test.cpp -o a.out -L ./ -lworld -lhello
由於靜態庫的依賴有順序,被調用庫應該放在調用庫後面,動態庫沒有依賴順序,正確輸入以下
g++ test.cpp -o a.out -L ./ -lhello -lworld
(4)靜態庫包含靜態庫