Linux庫多重依賴

源文件: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)靜態庫包含靜態庫

相關文章
相關標籤/搜索