我正在尝试链接一个使用来自第三方的多个共享库的c++程序。这些库主要来自一个名为MBSim的github项目,我下载了最新的每日版本及其所有二进制文件,库和 header ,并将其安装在/usr/local/mbsim-env上。

最重要的库是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部分调用了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。

10-06 03:50