2012-08-30 42 views
0

我在Linux機器上編寫了一個小型C++項目。我能夠使用-I和_L,-l命令正確地編譯和鏈接代碼。如何在LD_LIBRARY_PATH包含32位和64位版本的路徑時指定正確的庫使用

我在網上讀到,在運行代碼的時候,我們需要在LD_LIBRARY_PATH變量中有.so文件的路徑。現在我使用的是64位,還有另一個應用程序使用32位版本的庫。所以LD_LIBRARY_PATH有兩個版本的庫路徑。

當我嘗試運行我的應用程序,例如。 ./xyz ARG1 ARG2,我收到以下錯誤

./DaemonCpp: error while loading shared libraries: libldap.so: wrong ELF class: ELFCLASS32 

我想這是因爲它試圖加載32位版本,而不是64位版本。我試着改變LD_LIBRARY_PATH中提到的路徑的順序,使得到64位的路徑先到達,但仍然出現這個錯誤。有沒有一種方法可以指導應用程序使用庫的64位版本。

作爲我的主要問題的第二個問題,當我們鏈接C++代碼時,我們使用-L和庫名稱使用-l指定庫路徑。然後它應該知道在運行可執行文件時使用哪個庫,並且我不應該首先得到這個錯誤

回答

1

在回答第二個問題時,您只使用-L來指定鏈接時間路徑。您還需要爲-L指定的每個路徑添加-rpath=<path>。讓它看看運行時間。

如果你使用的GCC/G ++用於連接的驅動程序,那麼你應該使用-Wl,-rpath=<path>

例如庫libfoo.so在/opt/libs/lib64

gcc -o test test.o -L/opt/libs/lib64 -Wl,-rpath=/opt/libs/lib64 -lfoo 

在回答你的第一個問題,如果LD_LIBRARY_PATH導致問題出現,那麼你的第一個停靠港是ldd足見其路徑正在運行時鏈接庫。從空串開始並從那裏開始工作。

第三,如果LD_LIBRARY_PATH需要設置的原因是因爲有庫在/ opt/lib目錄,等等......那麼你應該將這些路徑您/etc/ld.so.conf使用ldconfig來更新這些搜索地圖庫。這通常會使您免於需要LD_LIBRARY_PATH變量。

+0

感謝您的回答 –

相關問題