2017-09-03 18 views
0

ROSパッケージでKilobotシミュレータKilomboを使用しようとしています。私は通常のようにKilomboをインストールしていて、ROSパッケージの中にKilomboヘッダファイルを含めようとしています。外部ヘッダーファイルをROSパッケージにリンクする

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>"

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のように見えます

しかし、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がkilombo」に含まれているそれ自体「kilolib.h」で定義されています.h "となります。

通常はシミュレーションをROSパッケージとして実行しないと、すべて正常に動作します。私が正常に実行しようとするとMakefileは次のようになります。実際のボット用にコンパイルした部分を削除しました。シミュレーション用ではありません。 ROSパッケージとしてシミュレーションを実行しているとき

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 

はしかし、我々は、私はとのトラブルを抱えていますものですCMakeLists.txtを定義する必要があります。私は間違って何をしているのですか?

+0

私たちが助けるために十分な情報がありません。定義されていない参照メッセージの一部(必ずしも全てではない)を見る必要があります。それらの名前はどこで定義されるべきだと思いますか?定義されていない参照メッセージが生成されたときに実行されるコマンドは何ですか? –

+0

ROSのCMakeLists.txtにKilomboパッケージへの参照を追加する必要があります。または、KelpieやGazeboのような他のシミュレータをROSと一緒に使うことができます – Sma

+0

@JonathanLeffler私は質問にさらに詳しい情報を追加しました。もう一度見てください。 – Rabee

答えて

0

問題は、私がシミュレーションのCMakeLists.txtの正しいライブラリにリンクしていないことでした。 target_link_libraries(generated_test ${catkin_LIBRARIES})target_link_libraries(generated_test ${catkin_LIBRARIES} sim headless SDL m Jansson)に変更してください。

関連する問題