2011-11-07 112 views
15

我想編譯這裏找到的項目之一 USB-I2C/SPI/GPIO接口適配器。無法打開共享目標文件

我下載了i2c_bridge-0.0.1-rc2.tgz包。我安裝了libusb,似乎沒有問題。我進入i2c_bridge-0.0.1-rc2/目錄並製作。編譯。我搬入i2c_bridge-0.0.1-rc2/i2c文件夾並製作。它編譯並給我./i2c。然而,當我運行它,它說:error while loading shared libraries: libi2cbrdg.so: cannot open shared object file: No such file or directory

生成文件在i2c_bridge-0.0.1-rc2/i2c有庫目錄作爲../libi2cbrdg.so位於此目錄中(i2c_bridge-0.0.1-rc2)。我也將該文件複製到/usr/local/lib。在i2c_bridge-0.0.1-rc2/目錄的ls

i2c  i2cbrdg.d i2cbrdg.o libi2cbrdg.a Makefile tests 
i2cbrdg.c i2cbrdg.h INSTALL libi2cbrdg.so README u2c4all.sh 

(即i2c是一個目錄)

如果我sudo ./i2c,它仍然給我的問題。

我只好帶走-Werror-noWdecrepated(拼寫?)選項中的所有makefile文件,讓他們來編譯,但應該不會影響這應該嗎?

它還有什麼需要找到.so文件?如果有人能幫我弄清楚什麼是錯的,我會非常感激。如果需要更多信息,我可以發佈。

回答

39

你必須區分在編譯時和運行時找到它。您在編譯時提供的-L標誌與運行時本地化庫無關。這是通過嵌入庫中的許多變量和一些路徑完成的。

最好的熱修復這個問題往往設置LD_LIBRARY_PATH的目錄與.so文件,如:

$ LD_LIBRARY_PATH=.. ./i2c 

對於一個長期的解決方案,你需要或者有仔細看整個LD系統使用rpath和runpath,或者使用libtool(它可以爲你解決這些問題)。

將文件複製到/ usr/local/lib目錄往往是不夠的,因爲LD緩存可用庫,所以你需要重新運行ldconfig(作爲root)複製庫到/ usr/local/lib目錄之後。

+0

LD_LIBRARY_PATH是否適用於我所有的庫?所以如果我做了這個命令,它會弄亂其他東西,直到我改回它?我如何看到它現在設置的是什麼? – Sterling

+2

這是一個環境變量。因此,您可以通過「echo $ LD_LIBRARY_PATH」來檢查它,並且它在命令行中設置的方式對於i2c進程及其子進程是本地的。 – thiton

+1

不是我的問題,但是感謝這幫助我解決了我的確切問題 – Rich

25

如果您正在構建從源代碼需要在庫中的代碼,你可以把這個庫是在環境變量LD_RUN_PATH建設之前的路徑,鏈接器將這個路徑保存到二進制文件,所以它將在運行時自動在正確的位置查找。

Linux特有的:或者,把庫中/lib/usr/lib,或者在你的/etc/ld.so.conf或其進口配置片段中引用的一些其他的路徑,然後將所有你需要做的就是運行/sbin/ldconfig刷新ld.so(動態鏈接)的庫緩存。

+0

即使我在/etc/ld.so.conf.d/libc.conf中有'/ usr/local/lib',**動態鏈接庫緩存刷新**與'sudo ldconfig'是什麼對我來說。 –

1

這適用於我的問題,希望能幫助任何人。

gcc test.c -Wl,-rpath /usr/local/lib -lfcgi -o test.fcg 

-Wl,-rpath選項是關鍵技巧。

相關問題