动态so库的链接:运行时链接和编译时链接
生活随笔
收集整理的這篇文章主要介紹了
动态so库的链接:运行时链接和编译时链接
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?? ?? 在編寫Makefile時,如果一個程序需要鏈接so庫,則需要通過兩個步驟來完成,分為運行時動態庫的鏈接和編譯時動態庫的鏈接,缺一不可。
???????
1、運行時動態庫的鏈接
在執行可執行文件時,提示:
error while loading shared libraries: libprint.so: cannot open shared object file: No such file or directory
解決:有三種方法
1)將 libprint.so放入系統庫或用戶庫目錄下:
sudo cp libprint.so /usr/local/lib sudo ldconfig2)在makefile中添加: -Wl,-rpath
LDFLAGS = -lm -lprint -L$(TOP_PATH)/lib -Wl,-rpath=$(TOP_PATH)/lib說明:
gcc編譯鏈接動態庫時,很有可能編譯通過但是執行時,找不到動態鏈接庫,那是因為-L選項指定的路徑只在編譯時有效,編譯出來的可執行文件不知道-L選項后面的值,當然找不到。
解決方法是通過-Wl,rpath=,使得execute記住鏈接庫的位置
3)使用LD_LIBRARY_PATH
推薦使用方法一。
2、編譯時鏈接
LDFLAGS
鏈接器參數,如指定庫位置:
LDFLAGS=-L/usr/lib -L/path/to/your/libLIBS
告訴鏈接器要鏈接哪些庫文件,如:LIBS = -lpthread -liconv 最正規的做法: LDFLAGS = -L/var/xxx/lib -L/opt/mysql/lib -lmysqlclient -liconv
因為LIBS不是makefile的自帶變量,屬于用戶自定義變量。
總結
以上是生活随笔為你收集整理的动态so库的链接:运行时链接和编译时链接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果7plus听筒呲呲杂音的原因
- 下一篇: 苹果7p和8的区别