2016-08-03 21 views
0

コンパイラはメッセージ(.../message.h)が見つからないことを伝えています。私のCMakeLists.txtを下記に見てくださいROS C++のカスタムメッセージが見つかりません

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をフラッシングしてコンパイルするように設定しました。次に、私はそれを真に戻し、再びコンパイルします。そうすることで、正常に動作します。しかし、...私は、よりエレガントでプロフェッショナルな/直感的な解決策があるはずです。これまでのところ、この問題の原因を検出することはできません。どのような解決してください?

私は問題が依存関係の順序に関連していると思います...どちらですか?ループ内で実行可能な目標

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

を追加するときは、メッセージ生成依存関係を追加しないようには考え...

答えて

1

それは、MY_FLAG =オフで最初に実行される可能性が高いあなたのケースで何が起こっているのか見えません実際に依存関係を追加する2番目のforeachにメッセージを生成します。 MY_FLAG = Onの2回目の実行は、メッセージがすでに生成されているために機能します。

+0

まだ同じ問題です。実際には、 '/ devel'と'/build'の両方を削除してから、もう一度コンパイルを試みてください。あるいは、あなたのパッケージを '/ catkin-dev/src /'から移動し、\ buidと\ develを削除してコンパイルしてから、プロジェクトを元に戻してもう一度コンパイルを試みてください。私の場合は、最初のコンパイルでフラグを立てる必要がありました。 – Courier

+0

実際、エラーは自分のexeファイルではないソースに関連しています。実際には、私が設定したフラグは、exeファイルだけでなく、ソースを有効/無効にします。 – Courier

1

あなたのEXPORTED_TARGETS依存関係が間違っているようです。 ${catkin_EXPORTED_TARGETS}への依存が助けることが失敗

add_dependencies(${file} external_package_generate_messages_cpp ${${PROJECT_NAME}_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}

でなければなりません。

関連する問題