首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在我的项目包中使用c++库gtsam?

如何在我的项目包中使用c++库gtsam?
EN

Stack Overflow用户
提问于 2017-06-06 17:03:02
回答 2查看 3.6K关注 0票数 1

这是我第一次使用除c++之外的外部OpenCV库。在代码中,我使用了相当多的罗斯功能,但我相信我的问题与ROS无关。我想用GTSAM库构建一个项目。

因此,我将存储库克隆到我的/usr/lib文件夹中,并按照指示进行安装。然后我编写了CMakeLists.txt,在我的.h文件中添加了两个包含,并试图编译。下面显示了我的.h文件的开头、编译错误和CMakeLists.txt。有趣的是,如果我注释掉第二个包含和只包含Pose2.h,编译工作。这意味着编译器至少从库中找到了一些标头,因此正确安装了它。我的cmake代码中应该链接库的部分是从给定这里的示例项目中提取出来的。任何帮助都是非常感谢的。

car_lib.h:

代码语言:javascript
运行
复制
#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....

编译时,我得到以下错误:

代码语言:javascript
运行
复制
...
[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

My CMakeLists.txt:

代码语言:javascript
运行
复制
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}
)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-13 12:41:20

尝试将## Declare a C++ library下的位替换为

代码语言:javascript
运行
复制
## 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}
)
票数 3
EN

Stack Overflow用户

发布于 2018-02-22 08:53:24

对于那些试图使用makefile做同样事情的人,下面是解决方案。注意,这是针对没有ROS的简单c++程序的。

代码语言:javascript
运行
复制
all: main.cpp
    @g++ main.cpp \
    -std=c++11 \
    -I /usr/include/eigen3 \
    -lboost_system -lboost_filesystem \
    -lgtsam \
    -o main
clear:
    @rm -rf main
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44395859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档