如何在Bazel中使用预编译Drake作外部依赖?编译报错求助
Drake预编译版+Bazel构建的常见问题与解决
场景背景
基于Drake的C++项目,采用Bazel构建系统。原使用drake_bazel_external将Drake源码作为外部依赖,运行正常;因需使用SNOPT求解器,切换为预编译版Drake并遵循drake_bazel_installed示例配置后,出现多编译报错。
问题1:Eigen头文件缺失
报错内容
In file included from .../drake/common/autodiff.h:12:10: fatal error: Eigen/Core: No such file or directory
解决方法
在项目根目录的.bazelrc中添加编译选项,手动指定Eigen头文件路径:
build --cxxopt=-I/usr/include/eigen3
注:此为临时 workaround,根源是预编译Drake的Bazel配置未正确导出依赖路径,后续可关注Drake官方更新修复。
问题2:@drake//tools/skylark:py.bzl路径错误
报错内容
ERROR: error loading package 'app': Label '@drake//tools/skylark:py.bzl' is invalid because 'tools/skylark' is not a package; perhaps you meant to put the colon here: '@drake//:tools/skylark/py.bzl'?
解决方法
预编译版Drake的Bazel包结构与源码版存在差异,需修改Bazel文件中的加载路径:
将代码中的load("@drake//tools/skylark:py.bzl", ...)修改为load("@drake//:tools/skylark/py.bzl", ...),调整路径的分隔逻辑。
问题3:drake/lcmt_iiwa_status.hpp头文件缺失
报错内容
In file included from .../drake/manipulation/kuka_iiwa/iiwa_status_receiver.h:6:10: fatal error: drake/lcmt_iiwa_status.hpp: No such file or directory
解决方法
该头文件是LCM消息自动生成的代码,需确保Bazel目标依赖正确的Drake库:
- 在
BUILD.bazel中,将目标的依赖从仅头文件集合改为具体的库目标:
cc_binary( name = "connection_test", srcs = ["connection_test.cc"], deps = [ "@drake//manipulation/kuka_iiwa:iiwa_status_receiver", # 其他依赖项... ], )
- 若需直接引用生成的LCM头文件,可显式添加
@drake//manipulation/kuka_iiwa:lcm_types到依赖列表中,确保生成的头文件被纳入编译路径。
同时检查WORKSPACE中预编译Drake的配置,确保使用drake_import_installed()(apt安装场景)或正确的http_archive配置,保证所有依赖包被正确导入。
内容的提问来源于stack exchange,提问作者Chen Wang
相关产品推荐
相关产品推荐

