Choreonoidの最新版に対応したUbuntuでもWindowsでも使えるKobuki用のモデルの作成しようとしています.そのために,Choreonoidのソースツリーの外でBodyIoRTCのビルドを試みています.Ubuntuではうまくできましたが,Windowsではまだ成功していません.以下に詳細を記しますので,ご助言をいただけると幸いです.
Ubuntuでは,ソースツリーとは独立したディレクトリに,cppファイルと以下のCMakeLists.txtを置いてビルドができ,実行の確認もできました.
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(KobukiIoRTC)
find_package(OpenRTM)
if (WIN32)
set(Choreonoid_DIR C:/Choreonoid/share/choreonoid/cmake)
endif (WIN32)
find_package(Choreonoid)
if (DEFINED OPENRTM_INCLUDE_DIRS)
string(REGEX REPLACE "-I" ";"
OPENRTM_INCLUDE_DIRS "${OPENRTM_INCLUDE_DIRS}")
string(REGEX REPLACE " ;" ";"
OPENRTM_INCLUDE_DIRS "${OPENRTM_INCLUDE_DIRS}")
endif (DEFINED OPENRTM_INCLUDE_DIRS)
if (DEFINED OPENRTM_LIBRARY_DIRS)
string(REGEX REPLACE "-L" ";"
OPENRTM_LIBRARY_DIRS "${OPENRTM_LIBRARY_DIRS}")
string(REGEX REPLACE " ;" ";"
OPENRTM_LIBRARY_DIRS "${OPENRTM_LIBRARY_DIRS}")
endif (DEFINED OPENRTM_LIBRARY_DIRS)
if (DEFINED OPENRTM_LIBRARIES)
string(REGEX REPLACE "-l" ";"
OPENRTM_LIBRARIES "${OPENRTM_LIBRARIES}")
string(REGEX REPLACE " ;" ";"
OPENRTM_LIBRARIES "${OPENRTM_LIBRARIES}")
endif (DEFINED OPENRTM_LIBRARIES)
include_directories(${OPENRTM_INCLUDE_DIRS})
include_directories(${OMNIORB_INCLUDE_DIRS})
include_directories(${CHOREONOID_INCLUDE_DIRS})
add_definitions(${OPENRTM_DEFINITIONS})
add_definitions(${OMNIORB_CFLAGS})
add_definitions(${CHOREONOID_DEFINITIONS})
link_directories(${OPENRTM_LIBRARY_DIRS})
link_directories(${OMNIORB_LIBRARY_DIRS})
link_directories(${CHOREONOID_LIBRARY_DIRS})
set(CMAKE_CXX_STANDARD 11)
if(MSVC)
add_compile_options(${OPENRTM_CFLAGS})
add_definitions(
-D__WIN32__ -D__x86__ -D__NT__ -D__OSVERSION__=4
-D_CRT_SECURE_NO_DEPRECATE -D_WIN32_WINNT=0x0500 -DRTC_CORBA_CXXMAPPING11)
endif()
function(add_cnoid_body_io_rtc)
set(target ${ARGV0})
list(REMOVE_AT ARGV 0)
add_library(${target} SHARED ${ARGV})
target_link_libraries(${target} CnoidBodyIoRTC CnoidBody CnoidUtil ${OPENRTM_LIBRARIES} ${OPENRTM_CAMERA_LIBRARY})
if(MSVC)
add_compile_options(${OPENRTM_CFLAGS})
endif()
set_target_properties(${target} PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${CNOID_PLUGIN_SUBDIR}/rtc
PREFIX "")
set_target_properties(${target} PROPERTIES
LIBRARY_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/rtc
PREFIX "")
if(ENABLE_INSTALL_RPATH)
set_target_properties(${target} PROPERTIES INSTALL_RPATH "$ORIGIN/../..")
endif()
install(TARGETS ${target}
RUNTIME DESTINATION ${CNOID_PLUGIN_SUBDIR}/rtc CONFIGURATIONS Release Debug
LIBRARY DESTINATION ${CNOID_PLUGIN_SUBDIR}/rtc CONFIGURATIONS Release Debug)
endfunction()
add_cnoid_body_io_rtc(KobukiIoRTC KobukiIoRTC.cpp)
CMakeやChoreonoidの理解が十分ではないため,不適切な部分があるかもしれません.ご指摘をいただけると幸いです.
ChoreonoidのCMakeの設定で,WindowsではINSTALL_SDKにチェックが入りませんが,これにチェックを入れてインストールしました.これによって,ヘッダファイルの問題は解決できましたが,リンクと実行に問題があります.
-
target_link_libraries()
にCnoidBody CnoidUtil ${OPENRTM_LIBRARIES}
を追加する必要がありました.Ubuntuでこれなしでリンクが通るのが不思議です. -
インストールディレクトリに
CnoidBodyIoRTC.lib CnoidBody.lib CnoidUtil.lib
がありません(Windoiwsではdllを使う場合でもlibが必要なのですよね?).CMakeでどのように解決すればいいのかわからなかったので,まずは,それらのファイルをビルドディレクトリのlibからインストールディレクトリのlibへ手作業でコピーしました. -
プロジェクトファイルで指定するBodyIoRTCのモジュールのパスをUbuntuとWindowsで統一したいのですが,
set_target_properties()
でLIBRARY_OUTPUT_DIRECTORY
やLIBRARY_OUTPUT_DIRECTORY_RELEASE
を設定しても,反映されません.dllファイルを手作業でbuild/rtcへコピーしたところ,Ubuntuと共通のプロジェクトファイルで動作することは確認しました.
以上です.よろしくお願いいたします.