ROS报错:CMakeList.txt配置错误——add_dependencies位置错误(难发现)

CMake报错:无法为不存在的目标添加依赖项解决方法
本文介绍了在使用CMake构建项目时遇到的`add_dependencies`错误,即尝试为未创建的目标添加依赖。错误原因是`add_executable`命令的位置不当。解决方案是调整`add_dependencies`在`add_executable`之后。博客还提醒开发者,在大型代码库中,通过关键字搜索可能难以定位此类问题,需要仔细检查CMakeLists.txt文件的结构。
部署运行你感兴趣的模型镜像

 这是我的报错:

CMake Error at server_client/CMakeLists.txt:137 (add_dependencies):
  Cannot add target-level dependencies to non-existent target "demo_server".

  The add_dependencies works for top-level logical targets created by the
  add_executable, add_library, or add_custom_target commands.  If you want to
  add file-level dependencies see the DEPENDS option of the add_custom_target
  and add_custom_command commands.

具有普遍性的一句话是:

CMake Error at ?????/CMakeLists.txt:????? (add_dependencies):
  Cannot add target-level dependencies to non-existent target "?????".

其中问号是根据路径和文件变化的。

原因

CMakeList.txt文件中add_executable前后都有add_dependencies,如果只认add_dependencies来进行配置的话很容易出现错误。

修改:(注意add_dependencies位置)

修改前:

## Add cmake target dependencies of the library
## as an example, code may need to be generated before libraries
## either from message generation or dynamic reconfigure
# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
add_dependencies(demo_server ${PROJECT_NAME}_gencpp)


## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
# add_executable(${PROJECT_NAME}_node src/server_client_node.cpp)
add_executable(demo_server src/demo01_server.cpp)

## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")

## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
# add_dependencies(demo_server ${PROJECT_NAME}_gencpp)

修改后:

## Add cmake target dependencies of the library
## as an example, code may need to be generated before libraries
## either from message generation or dynamic reconfigure
# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
# add_dependencies(demo_server ${PROJECT_NAME}_gencpp)


## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
# add_executable(${PROJECT_NAME}_node src/server_client_node.cpp)
add_executable(demo_server src/demo01_server.cpp)

## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")

## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
add_dependencies(demo_server ${PROJECT_NAME}_gencpp)

难发现的点

许多时候在配置CMakeList.txt因为代码多直接通过ctrl+f进行关键字搜索的方式去找相应需要配置的代码,但是add_dependencies出现了两个,而且位置不同效果也不同。如果因为位置错误导致报错,但是add_dependencies中的参数没错的情况下,很难发现错误的原因。

您可能感兴趣的与本文相关的镜像

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值