我正在尝试链接一个使用来自第三方的多个共享库的c++程序。这些库主要来自一个名为MBSim的github项目,我下载了最新的每日版本及其所有二进制文件,库和 header ,并将其安装在/usr/local/mbsim-env
上。
最重要的库是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
部分调用了include目录和标志: -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库的版本。
之后,对于从MBSim调用的几乎每个方法,我都会收到几个
undefined reference
警告: 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 64bits中完成了所有操作,而MBSim库也是64bits。
有人可以指出我的困境吗?
最佳答案
可能是您的第3方共享库是使用旧版GCC编译的吗? GCC 5中引入了一个新的ABI。您的平台上可能默认启用了它。参见https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html。
您可以尝试切换到较旧的ABI,但是这可能还要求您的其他库也已与旧的ABI一起编译。您也许还可以显式切换第三方库的ABI。