我與共享庫的鏈接和加載程序加載播放共享庫,並試圖瞭解不同的方法來解決加載錯誤:從任何目錄
error while loading shared libraries: ... : cannot open shared object file: No such file or directory
我設法解決這個問題使用LD_LIBRARY_PATH和使用rpath。我現在試着理解的LDCONFIG的使用,以及它如何解決它,太[我的一些網絡資源:1,2,3]
所以,我有以下的源文件:test.c func1.c func2.c
。這是我做的:
- 它們編譯成PIC .obj文件:
$ gcc -Wall -fPIC -c *.c
- 創建從對象文件的共享庫,並將其命名爲'libshared.so',並且使用 '的soname':
- 與一個共享庫鏈接(該
...
僅僅是我的個人共享庫路徑中的縮寫): - 現在,我嘗試運行它,並得到加載錯誤:
- 所以我儘量告訴加載器來搜索我的私有目錄中的共享庫文件:
$ gcc -shared -Wl,-soname,libshared.so -o libshared.so *.o
$ gcc -L/home/.../my_shared_library -Wall -o mytest test.c -lshared
./mytest: error while loading shared libraries: libshared.so: cannot open shared object file: No such file or directory
ldconfig -n home/.../my_shared_library
(我也試了一下:ldconfig -n .-L
當我的工作目錄是家庭/.../ my_shared_library )
並嘗試再次運行它,但我仍然得到相同的錯誤。我究竟做錯了什麼?
HowTo手冊是我的學習資源之一,我鏈接到討論我的問題內容的特定頁面。正如我寫的,我熟悉rpath,但我想使用ldconfig使其工作(如何寫共享庫也無助於此)。 – HeyJude
但你不設置'rpath'。我會在'/ etc/ld.so.conf'裏放一次'/ usr/local/lib /',把這個庫放在'/ usr/local/lib /'下並運行ldconfig' –
嗯,我的理解是''ldconfig -n <我的個人目錄>'應該使加載器可以在我的共享庫之後搜索指定的目錄,而不需要將它放到/ usr/local/lib中,也不需要使用rpath。這種理解源自一些閱讀,下面是一個例子:「你可以在簡單的情況下使用gcc的-L標誌,你可以使用''rpath'...'」(從這裏[link] http://tldp.org /HOWTO/Program-Library-HOWTO/shared-libraries.html) – HeyJude