C++文件如何在linux下生成動態庫So,以及如何使用這個動態庫


引用:http://blog.csdn.net/xuguang121/article/details/7457565

不同組件之間,如何提供一個動態庫給其他Team使用,這樣使用者也不需要關心和維護你的代碼。

Java中經常的做法就是打成Jar包,Windows C++ 通常會打成 動態鏈接庫和靜態的鏈接庫。 Linux 下,我經常的做法就是把C++ Soure 文件打包成.so

 

1.如何把C++ Src文件打包成.so 

下圖顯示就是我要打包成的幾個.so 

Command: g++ src.cpp -fPIC -shared -o lib***.so

注意事項: 生成的.so必須以 lib開始,一開始我就犯了錯誤,看我紅色線划的。

 

2.生成了這些.so那么使用的時候要注意的就是在你的MakeFile 文件中做一些事情

 

<1>.移除了原本的 Statistics.cpp Mutex.cpp

USER_SRCS= \

       Main.cpp\

       CFamily.pb.cc\

        CTimeCounter.cpp

<2>.USER_INCLDIRS=-Ihttp://www.cnblogs.com/test/testMsClient

加上需要鏈接的頭文件位置

<3>USER_LINK_DLLS = -L$(USER_DEPTH)/bin -lmscli -L$(USER_DEPTH)/bin/libs-lStaistics -L$(USER_DEPTH)/bin/libs-lMutex

加上需要鏈接的動態庫

 

3.查看生成的文件是不是含有了你的動態庫

ldd *****

 

 

g++編譯時的其他參數含義

 

-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文件來指定動態庫的目錄。通常這樣做就可以解決庫無法鏈接的問題了


免責聲明!

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



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