2011-12-16 50 views
2

我做了一個簡單的程序,使用共享對象,打開它dlopen()。我也編譯和鏈接像下面的共享對象:如何鏈接C中的共享對象?

gcc -o libmylib.so libmylib.c -shared -fPIC -Wall 

gcc -o program program.c -L. -lmylib -ldl -Wall 

當我試圖運行該程序的第一次,說什麼像

cannot open libmylib.so: no such file or directory 

所以我在網上搜索,發現我有將我的共享對象複製到/lib/i386-linux-gnu/以便程序運行。所以我這樣做了,而且工作正常,但是我試圖用其他方式來完成,因此我從/lib/i3686-linux-gnu/目錄中刪除了libmylib.so。現在,當我試圖運行該程序時,它顯示沒有錯誤,但一直說Segmentation fault。很顯然,共享對象無處可尋,但我怎樣才能鏈接它,而不需要複製任何東西?

我使用Ubuntu 11.10

+0

如果以root身份運行`ldconfig`,分段錯誤是否會消失? – zwol 2011-12-16 18:47:28

回答

2

當你編譯程序時,您鏈接得當;使用-L. -lmylib。但是,如果它不是標準的系統庫,執行環境需要知道在哪裏查找它。你可以做到這一點的方法之一是使用環境變量LD_LIBRARY_PATH,就像這樣:

LD_LIBRARY_PATH=. ./program 

export LD_LIBRARY_PATH=. 
./program 
4

瞭解更多關於shared libraries及其search paths,並ld命令。

另一種方法是註冊用於搜索庫的「運行時」路徑。你可以使用gcc -Wl,-rpath . -o program program.c -L. -lmylib -ldl -Wall

如果你的程序是dlopen在運行時-ing一些*.so文件後,將會更好地傳遞絕對文件名dlopen(或類似的東西"./foo.so")。 realpath函數可以幫助你。

甚至有一個命令chrpath(我剛剛發現)在現有的可執行文件上使用以更改其運行路徑。

存在安全原因(類似於PATH),以避免將當前目錄放入運行時路徑或LD_LIBRARY_PATH