2016-02-29 69 views
0

我與共享庫的鏈接和加載程序加載播放共享庫,並試圖瞭解不同的方法來解決加載錯誤:從任何目錄

error while loading shared libraries: ... : cannot open shared object file: No such file or directory

我設法解決這個問題使用LD_LIBRARY_PATH和使用rpath。我現在試着理解的LDCONFIG的使用,以及它如何解決它,太[我的一些網絡資源:123]

所以,我有以下的源文件:test.c func1.c func2.c。這是我做的:

  1. 它們編譯成PIC .obj文件:

$ gcc -Wall -fPIC -c *.c

  • 創建從對象文件的共享庫,並將其命名爲'libshared.so',並且使用 '的soname':
  • $ gcc -shared -Wl,-soname,libshared.so -o libshared.so *.o

    通過告訴GCC在哪裏可以找到共享庫
  • 與一個共享庫鏈接(該...僅僅是我的個人共享庫路徑中的縮寫):
  • $ 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 )

    並嘗試再次運行它,但我仍然得到相同的錯誤。我究竟做錯了什麼?

    回答

    0

    閱讀Program Library HowTo & Drepper的論文:How to Write Shared Libraries

    你可能要設置的rpath。請參閱this question

    您可能會在運行時加載您的插件dlopen(3)。請注意,沒有任何/的共享對象路徑是專門處理的。

    +0

    HowTo手冊是我的學習資源之一,我鏈接到討論我的問題內容的特定頁面。正如我寫的,我熟悉rpath,但我想使用ldconfig使其工作(如何寫共享庫也無助於此)。 – HeyJude

    +0

    但你不設置'rpath'。我會在'/ etc/ld.so.conf'裏放一次'/ usr/local/lib /',把這個庫放在'/ usr/local/lib /'下並運行ldconfig' –

    +0

    嗯,我的理解是''ldconfig -n <我的個人目錄>'應該使加載器可以在我的共享庫之後搜索指定的目錄,而不需要將它放到/ usr/local/lib中,也不需要使用rpath。這種理解源自一些閱讀,下面是一個例子:「你可以在簡單的情況下使用gcc的-L標誌,你可以使用''rpath'...'」(從這裏[link] http://tldp.org /HOWTO/Program-Library-HOWTO/shared-libraries.html) – HeyJude

    2

    使用GNU Libtool來簡化過程並避免此類錯誤。 當你建立你的圖書館時,還可以使用-fPIC選項。

    +0

    感謝這個工具,我對它並不熟悉。不過,我想直接使用shell命令,特別是使用ldconfig,而不是隱藏使用共享庫的複雜性。 – HeyJude