这是我的报错:
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中的参数没错的情况下,很难发现错误的原因。