【发布时间】:2017-09-27 21:02:52
【问题描述】:
我正在尝试链接一个使用来自第三方的多个共享库的 c++ 程序。主要是,这些库来自一个名为 MBSim 的 github 项目,我下载了最新的每日构建及其所有二进制文件、库和头文件,我安装在 /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 部分调用,您可能想知道,包含目录和标志:
-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 64 位上完成了所有工作,MBSim 库也是 64 位。
有人能指出我走出这个死胡同吗?
【问题讨论】:
-
链接时也使用
pkg-config --libs -
@BasileStarynkevitch,我也这样做了。我编辑了原始问题以包含该信息。
-
MBSim 似乎想要一条与
/usr/local/mbsim-env不同的路径 -
@Ripi2 你的意思是它是用不同的路径硬编码的?可能会跳转到原始编译网站?
-
我不知道。这是 MBSim 的决定。他们是否有一个 make 或 cmake 脚本,您可以查看搜索提示?