2017-09-27 71 views
1

我試圖鏈接一個使用多個來自第三方的共享庫的C++程序。這些庫主要來自github項目,名爲MBSim,我下載了最新的每日版本及其所有的二進制文件,庫和頭文件,我在/usr/local/mbsim-env上安裝了這些庫。g ++鏈接到第三方共享庫時未定義的引用錯誤

稱爲最重要的圖書館libmbsimlibopenmbvcppinterfacelibfmatveclibboost_filesystem(最後一個自帶的MBSim發行)。

我成立了一個簡單的代碼來測試它,它編譯像使用

g++ main.cpp -m64 -g3 -std=c++11 -Wall 
       -Wfatal-errors -Werror -Wno-unknown-pragmas -fopenmp 
       `pkg-config --cflags mbsim` -I. -c -o main.o 

pkg-config部分呼叫的魅力,你可以不知道,在包括目錄和標誌:

-DHAVE_ANSICSIGNAL -DHAVE_OPENMBVCPPINTERFACE -DHAVE_BOOST_FILE_LOCK 
    -I/usr/local/mbsim-env/include 
    -I/usr/include/x86_64-linux-gnu 
    -I/usr/include/x86_64-linux-gnu/c++/5 
    -I/usr/local/include 

當我嘗試將對象與預編譯的庫鏈接時,出現以下問題:

g++ system.o main.o -o teste -L/usr/local/mbsim-env/lib 
        -lmbsim -lopenmbvcppinterface -lboost_system 
        -lfmatvec -lm 
        -Wl,-rpath,/usr/local/mbsim-env/lib 

編輯:在上面的命令,我也嘗試使用pkg-config --libs以及。結果保持不變。

首先,鏈接器發出一個我鏈接到的舊的Boost庫警告:

/usr/bin/ld: warning: libboost_system.so.1.53.0, 
       needed by /usr/local/mbsim-env/lib/libmbsim.so, 
       may conflict with libboost_system.so.1.61.0 

我所知道的,但我故意要對舊的鏈接,因爲這是那是用來編譯MBSim庫的。

在那之後,我得到了幾個undefined reference警告,幾乎所有的方法,我從MBSim撥打:

system.cpp:59: undefined reference to 
     MBSim::RigidBody::RigidBody(std::__cxx11::basic_string<char, 
     std::char_traits<char>, std::allocator<char> > const&)' 

在我看來,這個錯誤意味着目標庫沒有RigidBody方法來實現。那麼,我知道他們這樣做。

我的第一個猜測是,也許鏈接器看着錯誤的庫路徑,所以我設置LD_LIBRARY_PATH=/usr/local/mbsim-env/lib並將-rpath添加到同一個文件夾。這完全沒有幫助。

一些谷歌搜索顯示我可以在64位編譯問題,並將其與32位庫鏈接。我認爲情況並非如此:我已經完成了Ubuntu 16.04 64位的所有工作,MBSim庫也是64位。

難道有人能指出我走出死衚衕嗎?

+0

使用也'鏈接時 –

+0

@BasileStarynkevitch pkg配置--libs',我已經做了這一點。我編輯了原始問題以包含這些信息。 –

+0

似乎MBSim想比一個不同的路徑'在/ usr /本地/ mbsim-env' – Ripi2

回答

1

難道你的第三方共享庫是使用舊版本的GCC編譯的嗎? GCC 5中引入了一個新的ABI。它可能在您的平臺上默認啓用。見https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html

您可以嘗試切換到較舊的ABI,但這可能需要您的其他庫也使用舊的ABI進行編譯。你也可以明確地切換第三方庫的ABI。

+0

謝謝@ ANY1,即解決了問題。我接着說:-D_GCLIBXX_USE_CXX11_ABI = 0'到我的編譯命令和未定義的引用'的std :: __ cxx11 :: basic_string'方法都沒有了。 –

0

未定義參照MBSim::RigidBody::RigidBody(std::__cxx11::basic_string<std::char_traits<char>, std::allocator<char> > const&)

這是爲了MBSim::RigidBody::RigidBody(const string&)的引用,具有g++ -std=c++11g++ 5或更高版本編譯。

由於ANY1大概猜出正確答案,你下載了與G ++ 4.x中內置的二進制文件libmbsim.so,並確定與此簽名相同的功能:

MBSim::RigidBody::RigidBody(std::basic_string<char, std::char_traits<char>, 
               std::allocator<char> > const&) 

注缺乏__cxx11命名空間。您可以輕鬆地證實或推翻這樣的:

nm -C libmbsim.so | grep 'MBSim::RigidBody::RigidBody' 

如果這種不匹配的確實原因,簡單地從源代碼重新構建這個項目編譯器。這就是開源

相關問題