2017-06-06 200 views
0

這是第一次使用一個外部的C++庫除了OpenCV的。在代碼中我使用了相當多的功能,但我相信我的問題與ROS沒有關係。我想用GTSAM library建立一個項目。如何在我的項目包中使用C++庫gtsam?

所以我克隆庫到我/usr/lib文件夾,並安裝了它的指示。 然後我寫了CMakeLists.txt,增加了兩個包含了我的 - 否則運行.h文件 - 並試圖編譯。 我.h文件的開頭,編譯錯誤和我的CMakeLists.txt如下所示。有趣的是,如果我註釋掉第二個包含,並且只包含Pose2.h,則編譯工作。這應該意味着編譯器至少從庫中找到了一些頭文件,但是它是正確安裝的。這是應該鏈接庫的我cmake代碼的部分是由給定here一個例子項目中提取。任何幫助表示讚賞。

car_lib.h:

#ifndef CAR_LIB_H 
#define CAR_LIB_H 

// GTSAM headers 
#include <gtsam/geometry/Pose2.h> 
#include <gtsam/nonlinear/NonlinearFactorGraph.h> 
using namespace gtsam; 

// rest of file follows.... 

編譯時,我得到以下錯誤:

... 
[100%] Linking CXX executable /home/marc/catkin_ws/devel/lib/car/car_node 
[100%] Linking CXX shared library /home/marc/catkin_ws/devel/lib/libcar_lib.so 
[100%] Built target car_lib 
CMakeFiles/car_node.dir/src/car_node.cpp.o: In function `__static_initialization_and_destruction_0(int, int)': 
/usr/local/include/gtsam/inference/Key.h:41: undefined reference to `gtsam::_defaultKeyFormatter[abi:cxx11](unsigned long)' 
/usr/local/include/gtsam/inference/Key.h:52: undefined reference to `gtsam::_multirobotKeyFormatter[abi:cxx11](unsigned long)' 
collect2: error: ld returned 1 exit status 
car/CMakeFiles/car_node.dir/build.make:113: recipe for target '/home/marc/catkin_ws/devel/lib/car/car_node' failed 
make[2]: *** [/home/marc/catkin_ws/devel/lib/car/car_node] Error 1 
CMakeFiles/Makefile2:384: recipe for target 'car/CMakeFiles/car_node.dir/all' failed 
make[1]: *** [car/CMakeFiles/car_node.dir/all] Error 2 
Makefile:138: recipe for target 'all' failed 
make: *** [all] Error 2 
Invoking "make -j4 -l4" failed 

我的CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.3) 
project(car) 

## Compile as C++11, supported in ROS Kinetic and newer 
add_compile_options(-std=c++11) 

find_package(catkin REQUIRED COMPONENTS 
    geometry_msgs 
    message_generation 
    nav_msgs 
    roscpp 
    sensor_msgs 
    std_msgs 
) 

###### GTSAM STUFF STARTS HERE 

# Include GTSAM CMake tools 
find_package(GTSAMCMakeTools) 
#include(GtsamBuildTypes) # Load build type flags and default to Debug mode 
#include(GtsamTesting) # Easy functions for creating unit tests and scripts 
#include(GtsamMatlabWrap) # Automatic MATLAB wrapper generation 

# Ensure that local folder is searched before library folders 
#include_directories(BEFORE "${PROJECT_SOURCE_DIR}") 

################################################################################### 
# Find GTSAM components 
find_package(GTSAM REQUIRED) # Uses installed package 
include_directories(${GTSAM_INCLUDE_DIR}) 

################################################################################### 
# Build static library from common sources 
#set(CONVENIENCE_LIB_NAME ${PROJECT_NAME}) 
#add_library(${CONVENIENCE_LIB_NAME} STATIC include/car/car_lib.h src/car_lib.cpp) 
#target_link_libraries(${CONVENIENCE_LIB_NAME} gtsam) 

###### GTSAM STUFF ENDS HER 

catkin_package(
    INCLUDE_DIRS include 
    LIBRARIES car_lib 
    CATKIN_DEPENDS 
    geometry_msgs 
    message_runtime 
    nav_msgs 
    roscpp 
    sensor_msgs 
    std_msgs 
) 

include_directories(
    include 
    ${catkin_INCLUDE_DIRS} 
) 

## Declare a C++ library 
add_library(car_lib 
    include/${PROJECT_NAME}/car_lib.h 
    src/car_lib.cpp 
) 

add_executable(car_node src/car_node) 
target_link_libraries(car_node ${catkin_LIBRARIES}) 
target_link_libraries(car_lib 
    ${catkin_LIBRARIES} 
) 

回答

1

嘗試

## Declare a C++ library 
add_library(car_lib src/car_lib.cpp) 
target_link_libraries(car_lib 
    gtsam 
    ${catkin_LIBRARIES} 
) 

add_executable(car_node src/car_node) 
target_link_libraries(car_node 
    car_lib 
    gtsam 
    ${catkin_LIBRARIES} 
) 
+0

人..感謝這麼多。它現在有效。你能詳細說明爲什麼你改變了三個命令的內容(add_library,target_link_libraries和add_executable)到他們現在的狀態嗎?會幫助我更好地理解cmake! –

1

對於那些誰正在嘗試使用生成文件做同樣的事情更換## Declare a C++ library下位,這是解決方案。 [注意這是針對沒有ROS的簡單C++程序]。

all: main.cpp 
    @g++ main.cpp \ 
    -std=c++11 \ 
    -I /usr/include/eigen3 \ 
    -lboost_system -lboost_filesystem \ 
    -lgtsam \ 
    -o main 
clear: 
    @rm -rf main 
相關問題