使用Drake构建CMake项目时,为什么会出现链接器错误,但是我可以清楚地看到这些符号?

时间:2018-12-15 01:18:44

标签: c++11 gcc clang abi drake

我已经按照Installation and Quickstart的说明进行操作,并且正在编写CMake项目以使用Drake。

我正在寻找一个构建在Drake中的单元测试,运行它,然后构建,运行并通过。但是,当我尝试在CMake项目中使用某些功能时,出现链接器错误,例如:

undefined reference to `RigidBodyTree<double>::get_position_name(int) const'

如果我查看Drake共享库中的符号(例如nm -Cobjdump -TCgrep),则会看到签名RigidBodyTree<double>::get_position_name[abi:cxx11](int)。但是,如果查看生成的目标代码(这会导致链接失败),则会看到RigidBodyTree<double>::get_position_name(int)

(注意:这篇文章是针对基于用户的问题从http://drake.mit.edu/faq.html迁移到StackOverflow的一种方法。)

1 个答案:

答案 0 :(得分:2)

这很可能是由于用于生成Drake的编译器(例如clang)和CMake选择的编译器(例如gcc-4.9)之间的不兼容性。具体来说,在与gcc-4.9编译的代码(ref)链接时,clang或之前的版本往往无法很好地处理DualABI。您可能还可以使用其他函数,因为只有返回返回ABI依赖类的函数(例如std::string)才被使用的ABI标记(因为它们无法在函数签名中区分)。

解决方法是更改​​CMake使用的编译器。一种实现方法是设置CCCXX环境变量以使用受支持的编译器。有关受支持的编译器的列表,请参见Supported Configurations。如果您使用的是预编译的二进制文件,请参阅Binary Packages了解所使用的编译器。

警告:请勿在Ubuntu中使用update-alternatives更改编译器,因为这可能会影响DKMS模块与内核的兼容性(除其他因素外,ref)。