我已经按照Installation and Quickstart的说明进行操作,并且正在编写CMake项目以使用Drake。
我正在寻找一个构建在Drake中的单元测试,运行它,然后构建,运行并通过。但是,当我尝试在CMake项目中使用某些功能时,出现链接器错误,例如:
undefined reference to `RigidBodyTree<double>::get_position_name(int) const'
如果我查看Drake共享库中的符号(例如nm -C
或objdump -TC
和grep
),则会看到签名RigidBodyTree<double>::get_position_name[abi:cxx11](int)
。但是,如果查看生成的目标代码(这会导致链接失败),则会看到RigidBodyTree<double>::get_position_name(int)
。
(注意:这篇文章是针对基于用户的问题从http://drake.mit.edu/faq.html迁移到StackOverflow的一种方法。)
答案 0 :(得分:2)
这很可能是由于用于生成Drake的编译器(例如clang
)和CMake选择的编译器(例如gcc-4.9
)之间的不兼容性。具体来说,在与gcc-4.9
编译的代码(ref)链接时,clang
或之前的版本往往无法很好地处理DualABI。您可能还可以使用其他函数,因为只有返回返回ABI依赖类的函数(例如std::string
)才被使用的ABI标记(因为它们无法在函数签名中区分)。>
解决方法是更改CMake使用的编译器。一种实现方法是设置CC
和CXX
环境变量以使用受支持的编译器。有关受支持的编译器的列表,请参见Supported Configurations。如果您使用的是预编译的二进制文件,请参阅Binary Packages了解所使用的编译器。
警告:请勿在Ubuntu中使用update-alternatives
更改编译器,因为这可能会影响DKMS模块与内核的兼容性(除其他因素外,ref)。