2016-08-18 115 views
1

我嘗試使用這個庫無法打開共享對象文件:沒有這樣的文件或目錄的錯誤,而有文件

我遵循這個網站創建共享庫和編譯我的main.chttp://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

我給這些命令:

gcc -fPIC -c *.c 
gcc -shared -Wl,-rpath,/opt/lib -Wl,-soname,libctest.so.1 -o libctest.so.1.0 *.o 
sudo mv libctest.so.1.0 /opt/lib 
sudo ln -sf /opt/lib/libctest.so.1.0 /opt/lib/libctest.so 
sudo ln -sf /opt/lib/libctest.so.1.0 /opt/lib/libctest.so.1 
gcc -Wall -L/opt/lib main.c -lctest -o prog 

命令沒有給出錯誤。當我執行的二進制文件./prog它給./prog: error while loading shared libraries: libctest.so.1: cannot open shared object file: No such file or directory

libctest.so.1/opt/lib

lrwxrwxrwx 1 root root 24 Aug 18 17:06 libctest.so -> /opt/lib/libctest.so.1.0 
lrwxrwxrwx 1 root root 24 Aug 18 17:06 libctest.so.1 -> /opt/lib/libctest.so.1.0 
-rwxr-xr-x 1 user user 7064 Aug 18 17:05 libctest.so.1.0 

而且ldd prog

linux-vdso.so.1 (0x00007ffe0f559000) 
libctest.so.1 => not found 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcd27fc6000) 
/lib64/ld-linux-x86-64.so.2 (0x00007fcd28371000) 

這樣有什麼不好?

我用debian 8.5gcc 4.9.2

+2

您可以使用鏈接器'-rpath'選項來指定可執行文件搜索庫的其他位置,而不是將它們移動。# – gilez

+0

謝謝@gilez'rpath'解決了我的問題。如果您發佈ypur評論作爲答案,我會接受。 – user4757345

+0

我將我的評論擴展爲一個答案,但正如我所說,我現在有點困惑。你仍然有問題,還是這一切工作? – gilez

回答

3

GCC的ld命令有一個--rpath選項,可以解決你的問題:

-rpath=dir 
     Add a directory to the runtime library search path. 

您應該在編譯庫的添加位置GCC的命令行編譯時prog,通過-wl選項:

-Wl,option 
     Pass option as an option to the linker. If option contains commas, 
     it is split into multiple options at the commas. 

所以,你的搜索路徑已經包括/opt/lib因爲獨創庫:

-Wl,-rpath,/opt/lib 

對於第二編譯,加libctest.so.1.0位置作爲另一個rpath,並且應該發現沒有你的需要來移動文件:

gcc -Wall -L/opt/lib main.c -lctest -Wl,-rpath,/you/dir/name -o prog 

我想你原來的努力失敗了,因爲鏈接器已經包含了一條到你原來的外部目錄的硬路徑,然後你從它下面移動了圖書館。

2

嘗試增加的/ opt/lib添加到如下LD_LIBRARY_PATH;

LD_LIBRARY_PATH=/opt/lib 
+1

設置'LD_LIBRARY_PATH'具有明顯的「污染」所有子進程的缺點。當你控制最終的鏈接時,一個更好的解決方案是將'-Wl,-rpath =/opt/lib'添加到鏈接命令中。 –

1

我有iccxml

iccToXml profile.icc profile.xml 

相同proplem當我轉換* .icc爲* .XML由上述代碼中,我recived相同的消息:不能打開共享對象文件:沒有這樣的文件或目錄,詳細:

iccToXml: error while loading shared libraries: libIccXML.so.2: cannot open shared object file: No such file or directory 

我使用解決了這個命令之前轉換

export LD_LIBRARY_PATH="/usr/local/lib" 

您可以用所需的應用程序文件路徑替換「/ usr/local/lib」。

希望對你有所幫助。

相關問題