linux下動態調用靜態庫的方法


LINUX下動態庫調用靜態庫的方法

有這樣一種情形,在創建一個動態庫的同時,可能會調用一個靜態庫,這個靜態庫可能是你自己寫的,也可能是第三方的。比如有下面五個文件,生成一個靜態庫,一個動態庫,一個執行文件:

/////// static.h

void static_print();

///////static.cpp

#include <iostream>

#include "static.h"

void static_print() {

     std::cout<<"This is static_print function"<<std::endl;

}

////// shared.h

void shared_print();

////// shared.cpp

#include <iostream>

#include "shared.h"

#include "static.h"

void shared_print() {

       std::cout<<"This is shared_print function";

        static_print();

}

////////test.cpp

   #include "share.h"

 

int main()

{

       shared_print();

       return 0;

   }

 

怎么辦呢?方法有兩種:

1、  動態庫是動態庫,靜態庫是靜態庫,各自編譯自己的,然后在最終使用的可執行文件上再動態編譯加載。按上面的例子來說明:

靜態庫的.o文件不用-fPIC生成生成動態庫時不加表態庫.

    生成應用程序時加載動態庫和靜態庫.

     g++ -c static.cpp // 生成static.o

     ar -r libstatic.a static.o // 生成靜態庫libstatic.a

     g++ -c -fPIC shared.cpp // 生成shared.o

     g++ -shared shared.o -o libshared.so // 生成動態庫libshared.so : -sharedg++的選項,shared.o無關這時如果加-lstatic. error:relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with –fPIC

(這里測試沒有出現這個問題,特意測試了一下)

     g++ test.cpp  -L. -lshared -lstatic -o test.exe // link libshared.so test.exe

2、  把靜態庫直接打到動態庫中去。

靜態庫的.o文件也用-fPIC生成生成動態庫時把靜態庫加入.

     生成應用程序時只加載動態庫

     g++ -c -fPIC static.cpp // 生成static.o

     ar -r libstatic.a static.o // 生成靜態庫libstatic.a

     g++ -c -fPIC shared.cpp // 生成shared.o

     g++ -shared shared.o –L. -lstatic -o libshared.so   // 生成動態庫libshared.so : -sharedg++的選項,shared.o無關. -lstatic選項把libstatic.a的函數加入動態庫中.

     g++ test.cpp   –L. -lshared -o test.exe // link libshared.so test.exe.

這個例子是從網上找來的,非常感謝。

至於哪種方式好,個人還是覺得看你的實際應用情況,仁者見仁,智者見智。

將多個靜態庫文件合成一個靜態庫文件。

假設tempa.a, tempb.a tempc.a /home/lib目錄下

mkdir /mytemp/libTest

cd /mytmp/libTest

ar x /home/lib /tempa.a

ar x /home/lib /tempb.a

ar x /home/lib tempc.a

ar cru libTest.a *.o

ranlib libTest.a


來源: http://fpcfjf.blog.163.com/blog/static/554697932013112532144781/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM