2012-03-03 68 views
9

我有兩個版本的GCC安裝在我的系統4.6.2和4.7.0。我正在運行Fedora Core 16.GCC沒有鏈接正確的庫

4.6.2安裝在/usr/bin和4.7.0安裝在/home/nerozehl/local/bin。 C++的庫和運行庫也編譯並安裝在/home/nerozehl/local/lib/home/nerozehl/local/lib64中。

我也有兩個版本的Boost安裝,庫中/usr/lib64/home/nerozehl/local/lib。 (分別爲Boost 1.47.0和1.49.0)

我遇到的問題是g ++/ld與默認庫鏈接,而不是/home/nerozehl/local中的新鏈接。我使用configure產生的Makefile,並且我打電話這樣說:

CXX=g++47 CXXFLAGS="-g -O0 -pg" LDFLAGS="-L/home/nerozehl/local/lib" ./configure --prefix=/home/nerozehl/local 

g++47駐留在/home/nerozehl/local/bin(在我$PATH)。

當我編譯,一切都很好,並且使用較新的標題,但是當我檢查什麼是鏈接的是:

ldd source/noes 
    linux-vdso.so.1 => (0x00007fffebfff000) 
    libboost_filesystem-mt.so.1.47.0 => /usr/lib64/libboost_filesystem-mt.so.1.47.0 (0x0000003c6a800000) 
    libboost_system-mt.so.1.47.0 => /usr/lib64/libboost_system-mt.so.1.47.0 (0x0000003c6a400000) 
    libboost_program_options-mt.so.1.47.0 => /usr/lib64/libboost_program_options-mt.so.1.47.0 (0x0000003c6ac00000) 
    libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003c6dc00000) 
    libm.so.6 => /lib64/libm.so.6 (0x0000003c68c00000) 
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003c69c00000) 
    libc.so.6 => /lib64/libc.so.6 (0x0000003c68800000) 
    libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003c69000000) 
    librt.so.1 => /lib64/librt.so.1 (0x0000003c69800000) 
    /lib64/ld-linux-x86-64.so.2 (0x0000003c68400000) 

對我的生活中,我無法弄清楚如何強制g ++/ld/configure使用我的較新庫。任何幫助,將不勝感激。

+0

+1使用LDD – pyCthon 2012-03-03 20:04:09

+0

你應該用'-v'選項查看如何在當前庫搜索路徑是這樣的:連接G ++會顯示哪些目錄將被搜索和以何種順序時。爲了避免這個問題,嘗試使用'-L'選項傳遞所需的路徑。我的猜測是它在其他目錄中的本地路徑之前搜索標準路徑。 – 2012-03-03 20:07:46

+0

我正在使用-L/home/nerozehl/local/lib – nerozehl 2012-03-03 20:13:09

回答

9

ldd不會告訴您可執行文件鏈接的內容 - 它會告訴您可執行文件在運行時將加載哪些共享對象。如果你想讓它從/家/ nerozehl加載運行時,你需要做的幾件事情之一:

  • 設置LD_LIBRARY_PATH包含的/ home/nerozehl/local/lib目錄,當你運行程序

  • add/home/nerozehl/local/lib到ld.so.conf,這樣它就會被所有人使用。但是,只適用於使用ld.so.conf的系統(如Linux)。

  • 將程序與-Wl,-rpath,/home/nerozehl/local/lib鏈接。但是,僅適用於使用ELF或其他支持它的可執行格式的系統。它還將路徑硬編碼到可執行文件中,這有點脆弱 - 如果將可執行文件移動到另一臺計算機或重新安排文件系統,可能會中斷。

+0

什麼程序會告訴我該文件鏈接到哪個庫? – nerozehl 2012-03-04 03:14:48

+0

@nerozehl - 鏈接完成後無法分辨,因爲該信息未存儲在二進制文件中。 – 2012-03-04 05:50:46

1

您確定您的配置腳本正在關注LDFLAGS嗎?運行./configure --help並查看選項。通常會有一個名爲--with-boost =的東西,然後給出boost所在的目錄。試試那個。對於其他任何遇到問題的選項也是如此。