天天看點

用g++編譯生成動态連接配接庫*.so的方法及連接配接 用g++編譯生成動态連接配接庫*.so的方法及連接配接

用g++編譯生成動态連接配接庫*.so的方法及連接配接

1、動态庫*.so的編譯

這裡我們用到4個檔案,它們分别為:SoDemoTest.h、one.cpp、two.cpp、three.cpp。它們的内容如下:

SoDemoTest.h

[cpp]  view plain  copy

  1. #ifndef __SO_DEMO_TEST_HEADER__  
  2. #define __SO_DEMO_TEST_HEADER__  
  3. #include <iostream>  
  4. using namespace std;  
  5. void one();  
  6. void two();  
  7. void three();  
  8. #endif  

one.cpp

[cpp]  view plain  copy

  1. #include "SoDemoTest.h"  
  2. void one()  
  3. {  
  4.     cout << "call one() function." << endl;  
  5. }  

two.cpp

[cpp]  view plain  copy

  1. #include "SoDemoTest.h"  
  2. void two()  
  3. {  
  4.     cout << "call two() function." << endl;  
  5. }  

three.cpp

[cpp]  view plain  copy

  1. #include "SoDemoTest.h"  
  2. void three()  
  3. {  
  4.     cout << "call three() function." << endl;  
  5. }  

将這幾個檔案編譯成動态庫libtest.so。編譯指令如下:

$ g++ one.cpp two.cpp three.cpp -fPIC -shared -o libtest.so

2、動态庫的連接配接

在上面的部分,我們已經生成了一個libtest.so的動态連結庫,現在我們用一個程式來調用這個動态連結庫。檔案名為:main.cpp

main.cpp

[cpp]  view plain  copy

  1. #include "SoDemoTest.h"  
  2. int main()  
  3. {  
  4.     one();  
  5.     two();  
  6.     three();  
  7.     return 0;  
  8. }  

将main.cpp與libtest.so連結成一個可執行檔案main。指令如下:

$ g++ main.cpp -L. -ltest -o main

測試可執行程式main是否已經連結的動态庫libtest.so,如果列出了libtest.so,那麼就說明正常連結了。可以執行以下指令:

$ ldd main

執行main可以看看main是否調用了動态連結庫中的函數。

3、編譯參數

-shared 該選項指定生成動态連接配接庫(讓連接配接器生成T類型的導出符号表,有時候也生成弱連接配接W類型的導出符号),不用該标志外部程式無法連接配接。相當于一個可執行檔案

-fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯後的代碼是位置相關的是以動态載入時是通過代碼拷貝的方式來滿足不同程序的需要,而不能達到真正代碼段共享的目的。

-L.:表示要連接配接的庫在目前目錄中

-ltest:編譯器查找動态連接配接庫時有隐含的命名規則,即在給出的名字前面加上lib,後面加上.so來确定庫的名稱

 LD_LIBRARY_PATH:這個環境變量訓示動态連接配接器可以裝載動态庫的路徑。

4、注意的問題

調用動态庫的時候有幾個問題會經常碰到,有時,明明已經将庫的頭檔案所在目錄 通過 “-I” include進來了,庫所在檔案通過 “-L”參數引導,并指定了“-l”的庫名,但通過ldd指令察看時,就是死活找不到你指定連結的so檔案,這時你要作的就是通過修改 LD_LIBRARY_PATH或者/etc/ld.so.conf檔案來指定動态庫的目錄。通常這樣做就可以解決庫無法連結的問題了。

轉自:http://blog.csdn.net/acb0y/article/details/6553051