2016-08-03 52 views
0

Der Compiler teilt mit, dass die Nachrichten (.../message.h) nicht gefunden werden. Siehe meine CMakeLists.txt unterROS C++ catkin findet meine benutzerdefinierten Nachrichten nicht

cmake_minimum_required(VERSION 2.8.3) 
project(my_package) 
add_compile_options(-std=c++11) 


find_package(catkin REQUIRED 
    COMPONENTS cv_bridge 
    image_transport 
    roscpp 
    #rospy 
    sensor_msgs 
    std_msgs 
    message_generation 
    genmsg 
    external_package 
) 
find_package(nodelet REQUIRED) 


#---- 
add_message_files(FILES 
    my_message1.msg 
    my_message2.msg 

) 

generate_messages(DEPENDENCIES 
    std_msgs sensor_msgs 
) 

catkin_package(
    CATKIN_DEPENDS message_runtime std_msgs sensor_msgs roscpp cv_bridge image_transport 
) 



#******  EXTRA PACKAGES 
find_package(LAPACK REQUIRED) 
find_package(BLAS REQUIRED) 
find_package(PkgConfig REQUIRED) 
FIND_PACKAGE(Boost) 
find_package(OpenCV) 
include_directories(${catkin_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS}) 

SET(MY_FLAG ok) # OR no!! 

if(MY_FLAG) 
#**** exe files 
set(exefiles 
    file1 
    file2 
) 

foreach(file ${exefiles}) 
    add_executable(${file} ${CMAKE_CURRENT_SOURCE_DIR}/pathToExeFiles/${file}.cpp) 
endforeach(file) 


#****** Lib & link 
include_directories(${SRC}/pathToMyLib) 
set(MY_LIB 
    lib1 
    lib2 
    libn 
) 
endif(MY_FLAG) 

foreach(file ${exefiles}) 
    target_link_libraries(${file2link} 
    ${MY_LIB} 
    ${MY_LIB} 
    ${MY_LIB} 
    ${catkin_LIBRARIES} 
    ${Boost_LIBRARIES} 
    ${gsl_LIBRARIES} ${LAPACK_LIBRARIES} ${BLAS_LIBRARIES} 
    ${OpenCV_LIBRARIES} 
    ) 

    add_dependencies(${file} external_package_generate_messages_cpp ${${my_package}_EXPORTED_TARGETS}) 
endforeach(file) 


ADD_SUBDIRECTORY(src) 

jedoch ist in der Lage mit dem folgenden Trick zu kompilieren. Ich habe zuerst My_FLAG zu flase und kompilieren gesetzt. Als nächstes setze ich es wieder auf true und kompiliere es erneut. Dadurch funktioniert es gut. Aber ... ich könnte vermuten, dass es eine elegantere/professionellere/einfachere Lösung geben sollte. Ich bin bisher nicht in der Lage, die Ursache dieses Problems zu erkennen. Irgendeine Lösung bitte?

Ich denke, das Problem hängt mit der Reihenfolge der Abhängigkeiten ... Welche? Keine Ahnung ...

Antwort

1

Es sieht aus wie Sie nicht Nachrichtengenerierung Abhängigkeit hinzuzufügen, wenn ausführbare Ziele innerhalb der Schleife Hinzufügen

if(MY_FLAG) 
#**** exe files 
set(exefiles 
    file1 
    file2 
) 

foreach(file ${exefiles}) 
    add_executable(${file} ${CMAKE_CURRENT_SOURCE_DIR}/pathToExeFiles/${file}.cpp) 
    add_dependencies(${file} external_package_generate_messages_cpp ${${my_package}_EXPORTED_TARGETS}) 
endforeach(file) 
.... 

Was höchstwahrscheinlich in Ihrem Fall geschieht ist, der erste Lauf mit MY_FLAG = Aus Sie generieren die Nachrichten in der zweiten foreach, wo Sie die Abhängigkeiten tatsächlich hinzufügen. Der zweite Lauf mit MY_FLAG = On funktioniert, weil jetzt die Nachrichten bereits generiert wurden.

+0

Immer noch das gleiche Problem. Versuchen Sie, "/ devel" und "/ build" zu entfernen, und versuchen Sie es erneut. Oder Sie könnten versuchen, Ihr Paket aus '/ catkin-dev/src /' zu entfernen, \ buid und \ devel zu entfernen, zu kompilieren, dann Ihr Projekt zurück zu verschieben und erneut zu kompilieren. In meinem Fall musste ich immer die Flagge setzen, um in der ersten Kompilation zu blinken .... – Courier

+0

In der Tat bezieht sich der Fehler auf ein Problem mit meinen Quellen nicht meine exe-Dateien. Tatsächlich aktiviert/deaktiviert das Flag, das ich gesetzt habe, auch die Quellen, nicht nur die EXE-Dateien. – Courier

1

Es scheint, dass Ihre EXPORTED_TARGETS-Abhängigkeit falsch ist.

add_dependencies(${file} external_package_generate_messages_cpp ${${my_package}_EXPORTED_TARGETS}) 

Die ${${my_package}_EXPORTED_TARGETS} sollte ${${PROJECT_NAME}_EXPORTED_TARGETS} oder ${my_package_EXPORTED_TARGETS}

sein so:

add_dependencies(${file} external_package_generate_messages_cpp ${${PROJECT_NAME}_EXPORTED_TARGETS}) 

Gelingt das nicht eine Abhängigkeit von ${catkin_EXPORTED_TARGETS} helfen können.