在 ROS 包中链接外部头文件
Linking external headers file in ROS package
我正在尝试将 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
时,我得到很多 "undefined reference" 错误。其中一些消息是:
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" 中定义,它本身包含在 "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,这正是我遇到的问题。我到底做错了什么?
问题是我没有链接到模拟 CMakeLists.txt 中的正确库。将行 target_link_libraries(generated_test ${catkin_LIBRARIES})
更改为 target_link_libraries(generated_test ${catkin_LIBRARIES} sim headless SDL m Jansson)
修复它。
我正在尝试将 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
时,我得到很多 "undefined reference" 错误。其中一些消息是:
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" 中定义,它本身包含在 "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,这正是我遇到的问题。我到底做错了什么?
问题是我没有链接到模拟 CMakeLists.txt 中的正确库。将行 target_link_libraries(generated_test ${catkin_LIBRARIES})
更改为 target_link_libraries(generated_test ${catkin_LIBRARIES} sim headless SDL m Jansson)
修复它。