g ++链接到第三方共享库时未定义的引用错误

问题描述:

我试图链接一个使用多个来自第三方的共享库的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

难道你的第三方共享库是使用旧版本的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'方法都没有了。 –

未定义参照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' 

如果这种不匹配的确实原因,简单地从源代码重新构建这个项目编译器。这就是开源