这是我的报错:
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中的参数没错的情况下,很难发现错误的原因。
CMake报错:无法为不存在的目标添加依赖项解决方法
本文介绍了在使用CMake构建项目时遇到的`add_dependencies`错误,即尝试为未创建的目标添加依赖。错误原因是`add_executable`命令的位置不当。解决方案是调整`add_dependencies`在`add_executable`之后。博客还提醒开发者,在大型代码库中,通过关键字搜索可能难以定位此类问题,需要仔细检查CMakeLists.txt文件的结构。
1600





