ubuntu下动态链接库的编译和使用实例
生活随笔
收集整理的這篇文章主要介紹了
ubuntu下动态链接库的编译和使用实例
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
以下實例的環(huán)境是amd64 + ubuntu10.10 +g++ 4.4.5測試成功,在其他配置的機器上可能有一點區(qū)別。 ?動態(tài)庫的使用方式中有兩種,第一種是類似于靜態(tài)庫的使用,另一種我稱之為真正的動態(tài)加載動態(tài)庫,主要是因為這種方式在程序運行的過程中加載鏈接庫,使用之后在卸載鏈接庫。 ??先介紹第一種。 ?在目錄/home/owner/test/下創(chuàng)建我們的實驗程序: ???? //dll_fun.c ? ?? #include<stdio.h> ? ???void dll_function(const char*szString) ? ?? { ? ????? ???printf("%s\n",?szString); ? ?? } ??編譯生成動態(tài)鏈接庫 ? ???gcc -c-fPIC?dll_fun.c //這里一定要加上-fPIC選項,不然下一步編譯失敗 ? ? ?? gcc -shared -fPIC -olibdllfun.so?dll_fun.o //生成動態(tài)鏈接庫libdllfun.so ? 創(chuàng)建調(diào)用動態(tài)庫方法: ? ???//main.c ? ?? void?dll_function(const char*szString); ? ???int main() ? ?? { ? ????? ??dll_function("This is the words of the dllfunction!!!!!!"); ? ?? ? ?? ?return0;? ? ?? } ??編譯main.c生成可執(zhí)行文件 ? ?? gcc -o main main.c -L. -ldllfun//這里提供了剛才生成的dllfun庫 ?如果此時執(zhí)行./main的話,會出現(xiàn)如下錯誤: ? ???cannot open shared object file:No such file or directory ??這是因為系統(tǒng)未找到動態(tài)庫libdllfun.so。 ? ??Linux動態(tài)鏈接庫的默認搜索路徑是/lib和/usr/lib,因此動態(tài)庫被創(chuàng)建后,一般都復制到這兩個目錄下面,當程序執(zhí)行時需要某動態(tài)庫,并且改動態(tài)庫還沒有加載到內(nèi)存中,則系統(tǒng)會自動到這兩個默認的搜索路徑中去查找相應的動態(tài)庫文件,然后加載改文件到內(nèi)存中,這樣程序就可以使用該動態(tài)庫中的函數(shù)以及該動態(tài)庫中的其他資源了。在linux中,動態(tài)庫的搜索路徑除了默認的搜索路徑外,還可以通過其他三種方法來指定,這里只介紹其中的一種:通過環(huán)境變量LD_LIBRARY_PATH指定動態(tài)庫搜索路徑。 ??當通過該環(huán)境變量指定多個動態(tài)鏈接庫搜索路徑時,路徑之間用冒號":"分隔。? ?? ??使用下面命令來配置環(huán)境 ????mkdir?/home/owner/test/lib//將這個目錄設置為動態(tài)庫的存放目錄 ????mkdir/home/owner/test/libdllfun.so?/home/owner/test/lib/libdllfun.so ????export?LD_LIBRARY_PATH=/home/owner/test/lib ??此時設置這個環(huán)境變量之后的所有命令命令中,該環(huán)境變量都有效。 ??把.so(動態(tài)鏈接庫)直接放在根目錄下的lib文件下(!!!一面總是加載不到路徑)
總結(jié)
以上是生活随笔為你收集整理的ubuntu下动态链接库的编译和使用实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里巴巴代码平台架构的演进之路
- 下一篇: Linux内核社区迁移到github?