天天看點

C++檔案如何在linux下生成動态庫So,以及如何使用這個動态庫

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

Java中經常的做法就是打成Jar包,Windows C++ 通常會打成 動态連結庫和靜态的連結庫。 Linux 下,我經常的做法就是把C++ Soure 檔案打包成.so

1.如何把C++ Src檔案打包成.so 

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

<a></a>

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

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

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

&lt;1&gt;.移除了原本的 Statistics.cpp Mutex.cpp

USER_SRCS= \

       Main.cpp\

       CFamily.pb.cc\

        CTimeCounter.cpp

&lt;2&gt;.USER_INCLDIRS=-Ihttp://www.cnblogs.com/test/testMsClient

加上需要連結的頭檔案位置

&lt;3&gt;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.:表示要連接配接的庫在目前目錄中

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

4、注意的問題

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