use_mrpt_as_libs - yuhannah/skills_map GitHub Wiki

使用MRPT作为三方库

1.下载MRPT源码

2.修改MRPT两个cmake文件

1.script_create_MRPTConfig.cmake

该文件产生MRPTConfig.cmake文件,定义了MRPT的源文件路径、头文件路径、二进制文件路径、配置文件路径等。

最前面是默认值。

随后分WIN和UNIX。

UNIX又分默认安装和自定义安装。

本例属于自定义安装。需要在cmake命令后添加自定义安装目录CMAKE_INSTALL_PREFIX。

SET(THE_MRPT_SOURCE_DIR "${MRPT_SOURCE_DIR}")
SET(THE_MRPT_LIBS_INCL_DIR "${THE_MRPT_SOURCE_DIR}/libs")
SET(THE_CMAKE_BINARY_DIR "${CMAKE_BINARY_DIR}")
SET(THE_MRPT_CONFIG_FILE_INCLUDE_DIR "${MRPT_CONFIG_FILE_INCLUDE_DIR}")

message(===================)
message(STATUS "THE_MRPT_SOURCE_DIR              = ${THE_MRPT_SOURCE_DIR}")
message(STATUS "THE_CMAKE_BINARY_DIR             = ${THE_CMAKE_BINARY_DIR}")
message(STATUS "THE_MRPT_CONFIG_FILE_INCLUDE_DIR = ${THE_MRPT_CONFIG_FILE_INCLUDE_DIR}")
message(STATUS "THE_MRPT_LIBS_INCL_DIR           = ${THE_MRPT_LIBS_INCL_DIR}")

//...

SET(MRPT_CONFIGFILE_IS_INSTALL 1)
IF(WIN32)
	SET(THE_MRPT_SOURCE_DIR "\${THIS_MRPT_CONFIG_PATH}")
	SET(THE_MRPT_LIBS_INCL_DIR "${THE_MRPT_SOURCE_DIR}/libs")
	SET(THE_CMAKE_BINARY_DIR "\${THIS_MRPT_CONFIG_PATH}")
	SET(THE_MRPT_CONFIG_FILE_INCLUDE_DIR "\${THIS_MRPT_CONFIG_PATH}/include/mrpt/mrpt-config/")
ELSE(WIN32)
	# Unix install. This .cmake file will end up in /usr/share/mrpt/MRPTConfig.cmake :
	IF (CMAKE_MRPT_USE_DEB_POSTFIXS)
		# We're building a .deb package: DESTDIR is NOT the final installation directory:
		SET(THE_MRPT_SOURCE_DIR "/usr")
		SET(THE_MRPT_LIBS_INCL_DIR "${THE_MRPT_SOURCE_DIR}/include/mrpt")
		SET(THE_CMAKE_BINARY_DIR "/usr")
		SET(THE_MRPT_CONFIG_FILE_INCLUDE_DIR "/usr/include/mrpt/mrpt-config/")
	ELSE(CMAKE_MRPT_USE_DEB_POSTFIXS)
		# Normal case: take the desired installation directory
#		SET(THE_MRPT_SOURCE_DIR "${CMAKE_INSTALL_PREFIX}")
		SET(THE_MRPT_SOURCE_DIR "${THE_MRPT_SOURCE_DIR}")
#		SET(THE_MRPT_LIBS_INCL_DIR "${THE_MRPT_SOURCE_DIR}/include/mrpt")
		SET(THE_MRPT_LIBS_INCL_DIR "${THE_MRPT_SOURCE_DIR}/libs")
		SET(THE_CMAKE_BINARY_DIR "${CMAKE_INSTALL_PREFIX}")
#		SET(THE_MRPT_CONFIG_FILE_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/include/mrpt/mrpt-config/")
		SET(THE_MRPT_CONFIG_FILE_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/include/mrpt-config/unix")
	ENDIF(CMAKE_MRPT_USE_DEB_POSTFIXS)
ENDIF(WIN32)

//...

message(===================)
message(STATUS "THE_MRPT_SOURCE_DIR              = ${THE_MRPT_SOURCE_DIR}")
message(STATUS "THE_CMAKE_BINARY_DIR             = ${THE_CMAKE_BINARY_DIR}")
message(STATUS "THE_MRPT_CONFIG_FILE_INCLUDE_DIR = ${THE_MRPT_CONFIG_FILE_INCLUDE_DIR}")
message(STATUS "THE_MRPT_LIBS_INCL_DIR           = ${THE_MRPT_LIBS_INCL_DIR}")

2.script_create_config_h.cmake

该文件产生/mrpt/config.h文件。

仅去掉了路径最后的"/",尝试不去掉"/",编译仍能通过。原因不明。

IF(UNIX)
#	SET(MRPT_CONFIG_FILE_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include/mrpt-config/unix/" )
	SET(MRPT_CONFIG_FILE_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include/mrpt-config/unix" )
ENDIF(UNIX)

3.编译MRPT源码

如上所述,需要在cmake命令后添加自定义安装路径:CMAKE_INSTALL_PREFIX。

mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/home/yu/sources/mrpt/build
make -j8

4.新建测试工程

1.新建目录test

mkdir test
cd test

2.新建测试文件test.cpp

3.新建CMakelists.txt文件

根据cmake编译提示,需要提供包含MRPTConfig.cmake文件的路径作为MRPT_DIR。

从MRPT编译结果来看,MRPTConfig.cmake文件产生在”/home/yu/sources/mrpt/build“路径下。

CMAKE_MINIMUM_REQUIRED(VERSION 2.8.7)

add_compile_options(-std=c++11)

project(test)

SET(MRPT_DIR "/home/yu/sources/mrpt/build")

FIND_PACKAGE( MRPT REQUIRED slam gui obs base maps opengl tfest)

if (MRPT_FOUND)
    message(STATUS "FOUND MRPT")
    message(STATUS "MRPT_VERSION  = ${MRPT_VERSION}")
    message(STATUS "MRPT_LIBS     = ${MRPT_LIBS}")
    message(STATUS "MRPT_INCLUDE_DIRS     = ${MRPT_INCLUDE_DIRS}")
    message(STATUS "MRPT_LINK_DIRECTORIES = ${MRPT_LINK_DIRECTORIES}")

    add_executable(${PROJECT_NAME} test.cpp)
    target_link_libraries(${PROJECT_NAME} mrpt-slam mrpt-gui mrpt-obs mrpt-base mrpt-maps mrpt-opengl mrpt-tfest)
endif(MRPT_FOUND)

4.新建build目录存放编译结果

mkdir build

5.编译运行测试代码

cmake .. 
make -j8
./test