2017-06-15 144 views
0

你好,我在CmakeList和Boost的依賴方面遇到了麻煩。我CmakeList看起來是這樣的:在CmakeList中鏈接Boost庫的麻煩

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}) 

首先我有這個,我couldn't完成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. 

當我擡起頭來的錯誤我主要是看到題目說的鏈接庫的語法是不正確的,問題是我的語法與解決方案主題中提到的語法相同。

爲什麼我得到這個錯誤,我該如何解決這個問題?

在此先感謝

編輯:我看到有什麼我的項目其實是有些混亂。我正在運行一個ROS包,它是通過MoveIT設置助手創建的,該助手爲我的catkin_workspace中的ROS生成一個包。在此工作區中,我的軟件包文件夾位於名稱cpp_arm。在這個包/文件夾裏面是我的CmakeList,在這個文件夾裏面還有一個文件夾src它包含一個簡單的C++文件(test_arm.cpp)。

這CPP文件看起來像這樣:

#include <moveit/move_group_interface/move_group_interface.h> 

main() 
{ 

} 

我在Ubuntu上add_libraryadd_executable創建目標16.04

+0

你是否正在交叉編譯?或者是你的開發機器ARM? cpp_arm是紅鯡魚嗎? – sehe

回答

2

target_link_libraries工程運行ROS動能版本: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

+0

謝謝,這確實是「問題」。 –