【问题标题】:Linking external headers file in ROS package在 ROS 包中链接外部头文件
【发布时间】:2017-09-03 12:48:52
【问题描述】:

我正在尝试将 Kilobot 模拟器 Kilombo 与 ROS 包一起使用。我正在正常安装 Kilombo,然后尝试将 Kilombo 头文件包含在 ROS 包中。 Kilombo 的 CMakeLists.txt 是这样的

add_library(sim display.c skilobot.c kbapi.c params.c stateio.c runsim.c neighbors.c distribution.c gfx/SDL_framerate.c gfx/SDL_gfxPrimitives.c gfx/SDL_gfxBlitFunc.c gfx/SDL_rotozoom.c)

add_library(headless skilobot.c kbapi.c params.c stateio.c runsim.c neighbors.c distribution.c)
set_target_properties(headless PROPERTIES COMPILE_DEFINITIONS "SKILO_HEADLESS")

if(CMAKE_COMPILER_IS_GNUCXX)
    add_definitions(-std=c99)
    add_definitions("-Wall -O2 -g")
#    add_definitions("-Wall -O3 -march=native -g")  
endif()

INSTALL(TARGETS sim headless
  ARCHIVE DESTINATION lib
)

INSTALL(FILES kilombo.h DESTINATION include)

INSTALL(FILES kilolib.h message.h message_crc.h params.h skilobot.h
    DESTINATION include/kilombo)

add_subdirectory(tests)

我正在创建的 ROS 包的 CMakeLists.txt 如下所示:

cmake_minimum_required(VERSION 2.8.3)
project(Kilombo_test)
find_package(catkin REQUIRED roscpp std_msgs)
if(CMAKE_COMPILER_IS_GNUCXX)
    add_definitions(-std=c99)
    add_definitions("-Wall -O2 -g")
endif()
include_directories(/usr/local/include /usr/local/lib)
link_directories(/usr/local/include)
add_executable(generated_test orbit.c)
target_link_libraries(generated_test ${catkin_LIBRARIES})

我像往常一样包含 Kilombo 头文件:"#include <kilombo.h>"

但是,当我运行catkin_make 时,我收到许多“未定义引用”错误。其中一些消息是:

orbit.c:53 undefined reference to 'kilo_turn_left'
orbit.c:53 undefined reference to 'set_motors'

这些消息显示在命令之后:

####
#### Running command: "make -j2 -l2" in "/home/viki/catkin_ws/build"
####
Linking C executable generated_test

kilo_turn_left 和函数set_motors 都定义在“kilolib.h”中,而该“kilolib.h”本身包含在“kilombo.h”中。

如果尝试正常运行模拟而不是作为 ROS 包运行,一切正常。我尝试运行时的 Makefile 通常如下所示。我已经删除了为真实机器人而不是模拟编译的部分。

SOURCES=orbit.c 
EXECUTABLE=orbit

# path of kilombo.h distributed with the simulator but also needed
# when compiling the user program for the real kilobot (avr-gcc has different default paths)
SIMHEADERS=/usr/local/include

#path to kilolib.a in the official kilolib, needed for real bots only
KILOLIB    =$(KILOHEADERS)/build/kilolib.a

SIM_CFLAGS = -c -g -O2 -Wall -std=c99  

SIM_LFLAGS = -lsim -lSDL -lm -ljansson
sim: $(EXECUTABLE)
hex: $(EXECUTABLE).hex
all: sim hex

clean :
    rm *.o $(EXECUTABLE) *.elf *.hex

但是,当以 ROS 包的形式运行模拟时,我们需要定义一个 CMakeLists.txt,这是我遇到的问题。我到底做错了什么?

【问题讨论】:

  • 没有足够的信息让我们提供帮助。我们需要查看一些(不一定是全部)未定义的参考消息。您认为应该在哪里定义这些名称?生成未定义的参考消息时执行什么命令?
  • 您必须在 ROS 的 CMakeLists.txt 中添加对 Kilombo 包的引用。或者您可以使用其他模拟器,如 Kelpie 或 Gazebo 以及 ROS
  • @JonathanLeffler 我已经为这个问题添加了更多细节。请再看看。
  • @Sma 如何在 CMakeLists.txt 中正确添加对 Kilombo 包的引用?不能使用其他模拟器。
  • 在构建过程中由 cmake 产生的好消息会适得其反,通常是在出现问题时。这是一个例子。说“链接”让我没有什么可做的,而且我不知道足够多的 cmake 知道如何将你推向正确的方向。您作为示例提供的符号是来自 Kilombo 库还是来自本地源代码?

标签: c cmake linker ros catkin


【解决方案1】:

问题是我没有链接到模拟的 CMakeLists.txt 中的正确库。将行 target_link_libraries(generated_test ${catkin_LIBRARIES}) 更改为 target_link_libraries(generated_test ${catkin_LIBRARIES} sim headless SDL m Jansson) 修复它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    相关资源
    最近更新 更多