我試圖鏈接一個使用多個來自第三方的共享庫的C++程序。這些庫主要來自github項目,名爲MBSim,我下載了最新的每日版本及其所有的二進制文件,庫和頭文件,我在/usr/local/mbsim-env
上安裝了這些庫。g ++鏈接到第三方共享庫時未定義的引用錯誤
稱爲最重要的圖書館libmbsim
,libopenmbvcppinterface
,libfmatvec
和libboost_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位。
難道有人能指出我走出死衚衕嗎?
使用也'鏈接時 –
@BasileStarynkevitch pkg配置--libs',我已經做了這一點。我編輯了原始問題以包含這些信息。 –
似乎MBSim想比一個不同的路徑'在/ usr /本地/ mbsim-env' – Ripi2