2016-08-03 94 views
0

編譯器告訴消息(.../message.h)未找到。看到我的CMakeLists.txt下面ROS C++ catkin找不到我的自定義消息

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) 

但是,我們能夠用以下技巧編譯。我首先設置My_FLAG來進行編譯和編譯。接下來,我將其設置爲true並重新編譯。通過這樣做,它工作正常。但是......我猜想應該有更優雅/專業/直接的解決方案。到目前爲止,無法檢測到這個問題的原因。請任何解決方案?

我認爲這個問題與依賴關係的順序有關......哪個?不知道......

回答

1

它看起來像環

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) 
.... 

什麼是你的情況最有可能發生的是,與MY_FLAG第一次運行=關中添加可執行的目標時,您不添加消息產生依賴性您在第二個foreach中生成實際添加依賴關係的消息。第二次運行MY_FLAG = On,因爲現在消息已經生成。

+0

仍是同樣的問題。實際上,試着刪除'/ devel'和'/ build',然後再次嘗試編譯。或者,你可以嘗試從'/ catkin-dev/src /'移出你的軟件包,刪除\ buid和\ devel,編譯,然後移回你的項目並重新編譯。在我的情況下,我不得不始終設置標誌在第一編譯flase .... – Courier

+0

事實上,錯誤是與我的來源不是我的exe文件的問題有關。事實上,我設置的標誌也啓用/禁用源,而不僅僅是exe文件。 – Courier

1

看起來您的EXPORTED_TARGETS依賴項是錯誤的。

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

${${my_package}_EXPORTED_TARGETS}應該是${${PROJECT_NAME}_EXPORTED_TARGETS}${my_package_EXPORTED_TARGETS}

這樣:

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

做不到這一點上${catkin_EXPORTED_TARGETS}的依賴可能會有所幫助。