您好,我在使用CmakeList和Boost依赖项时遇到麻烦。我的CmakeList看起来像这样:

cmake_minimum_required(VERSION 2.8.3)
project(cpp_arm)

add_compile_options(-std=c++11)

find_package(catkin REQUIRED COMPONENTS
    moveit_core
)

find_package(Boost REQUIRED COMPONENTS
    system
    filesystem
    date_time
    thread
)

catkin_package()

include_directories(${catkin_INCLUDE_DIRS})
include_directories(SYSTEM ${Boost_INCLUDE_DIRS})

add_executable(hello_world src/hello_world.cpp)
add_executable(test_arm src/test_arm.cpp)

target_link_libraries(cpp_arm ${Boost_LIBRARIES})


install(DIRECTORY launch DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
  PATTERN "setup_assistant.launch" EXCLUDE)
install(DIRECTORY config DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})


首先,我遇到了无法完成catkin_make的麻烦。我没有以下代码:

target_link_libraries(cpp_arm ${Boost_LIBRARIES})


这给了我以下错误:

CMakeFiles/test_arm.dir/src/test_arm.cpp.o: In function `_GLOBAL__sub_I_main':
test_arm.cpp:(.text.startup+0x43): undefined reference to `boost::system::generic_category()'
test_arm.cpp:(.text.startup+0x48): undefined reference to `boost::system::generic_category()'
test_arm.cpp:(.text.startup+0x4d): undefined reference to `boost::system::system_category()'
collect2: error: ld returned 1 exit status


在查找了该错误之后,我在此上找到了不同的主题(在堆栈上),这些主题表示您需要在cmakelist中链接boost库,以使cmake“查找”它。我做到了,如我的代码所示(根据提到的主题中描述的语法),但这会导致新的错误:

CMake Error at cpp_arm/CMakeLists.txt:25 (target_link_libraries):
  Cannot specify link libraries for target "cpp_arm" which is not built by
  this project.


当我查找该错误时,我主要看到的主题是链接库的语法不正确,问题是我的语法与作为解决方案的主题中提到的语法相同。

为什么会出现此错误,我该如何解决?

提前致谢

编辑:我看到我的项目实际上是什么有些困惑。我正在运行通过MoveIT设置助手创建的ROS程序包,该程序在catkin_workspace中为ROS生成了一个程序包。在此工作空间内,我的软件包文件夹位于名称为cpp_arm的位置。在这个包/文件夹中是我的CmakeList,在这个文件夹中还有一个src文件夹,其中包含一个简单的c ++文件(test_arm.cpp)。

此cpp文件如下所示:

#include <moveit/move_group_interface/move_group_interface.h>

main()
{

}


我在Ubuntu 16.04上运行ROS动力学版本

最佳答案

target_link_libraries适用于使用add_libraryadd_executable创建的目标:cpp_arm是项目的名称,但是您没有使用该名称创建的目标。像这样:

add_executable(cpp_arm ...)
target_link_libraries(cpp_arm ${Boost_LIBRARIES})


但是我想您想要实现的更多是链接test_arm

add_executable(test_arm src/test_arm.cpp)

target_link_libraries(test_arm ${Boost_LIBRARIES})




顺便说一句,而不是:

add_compile_options(-std=c++11)


让CMake根据所选标准处理编译选项:

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)


还考虑compile features

10-05 21:38