0

我已按照安装和快速入门说明进行操作,并且正在编写一个使用 Drake 的 CMake 项目。

我正在查看一个在 Drake 中构建、运行它的单元测试,它构建、运行并通过。但是,当我尝试在我的 CMake 项目中使用其中一些功能时,我收到了链接器错误,例如:

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

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

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

4

1 回答 1

2

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

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

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

于 2018-12-15T01:22:46.950 回答