g ++链接到第三方共享库时未定义的引用错误
我试图链接一个使用多个来自第三方的共享库的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位。
难道有人能指出我走出死胡同吗?
难道你的第三方共享库是使用旧版本的GCC编译的吗? GCC 5中引入了一个新的ABI。它可能在您的平台上默认启用。见https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html。
您可以尝试切换到较旧的ABI,但这可能需要您的其他库也使用旧的ABI进行编译。你也可以明确地切换第三方库的ABI。
谢谢@ ANY1,即解决了问题。我接着说:-D_GCLIBXX_USE_CXX11_ABI = 0'到我的编译命令和未定义的引用'的std :: __ cxx11 :: basic_string'方法都没有了。 –
未定义参照
MBSim::RigidBody::RigidBody(std::__cxx11::basic_string<std::char_traits<char>, std::allocator<char> > const&)
这是为了MBSim::RigidBody::RigidBody(const string&)
的引用,具有g++ -std=c++11
和g++
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'
如果这种不匹配的确实原因,简单地从源代码重新构建这个项目您编译器。这就是开源为。
使用也'链接时 –
@BasileStarynkevitch pkg配置--libs',我已经做了这一点。我编辑了原始问题以包含这些信息。 –
似乎MBSim想比一个不同的路径'在/ usr /本地/ mbsim-env' – Ripi2