您好,我在使用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_library
和add_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。