使用Cmake封装API接口成Package方法

本文是个人探究API封装成Package以让他人像使用OpeCV,PCL等第三方库那样方便时所总结的经验。

一、CmakeLists.txt的编写

1、基本工程实现

cmake_minimum_required(VERSION x.x) #最小Cmake版本要求

projiect() #工程名称

find_package() #引入第三方库

add_library() #编译代码为库文件,SHARED标志可以指定为动态库

2、特殊实现

target_include_directories(ImagePreprocess PUBLIC

$

$)

设置目标库要链接的头文件路径,无论是API本身还是引用API的消费者都需要使用该目录下的头文件,所以使用PUBLIC标志;避免被使用时API的头文件路径不受编译路径影响,所以要分别设置BUILD_INTERFACE与INSTALL_INTERFACE。

target_link_libraries(ImagePreprocess PRIVATE vpi PUBLIC opencv_core)

设置API需要链接的库,其中vpi只由API自身使用,消费者不会直接使用vpi的相关函数或者变量,所以vpi使用PRIVATE标志;其中opencv_core被API使用,并且API的消费者也会使用其中的变量类型,所以采用PUBLIC标志。

install(TARGETS ImagePreprocess

DESTINATION ImagePreprocess/lib

EXPORT ImagePreprocessTargets)

安装库文件,较平时不同的是要加入EXPORT

install(FILES include/ImagePreprocess.h

DESTINATION ImagePreprocess/include)

安装头文件

install(EXPORT ImagePreprocessTargets

FILE ImagePreprocessTargets.cmake

DESTINATION ImagePreprocess/lib/cmake/ImagePreprocess)

生成ImagePreprocessTargets.cmake文件,并且安装在指定目录

include(CMakePackageConfigHelpers)

一个用于生成重定位配置文件的工具

configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in

ImagePreprocessConfig.cmake

INSTALL_DESTINATION "ImagePreprocess/lib/cmake/ImagePreprocess"

NO_SET_AND_CHECK_MACRO

NO_CHECK_REQUIRED_COMPONENTS_MACRO)

生成一个可以重定向的ImagePreprocessConfig.cmake,生成的ImagePreprocessConfig.cmake在build目录下

install(FILES

${CMAKE_CURRENT_BINARY_DIR}/ImagePreprocessConfig.cmake

DESTINATION ImagePreprocess/lib/cmake/ImagePreprocess

)

安装ImagePreprocessConfig.cmake到指定目录

二、Config.cmake.in编写

@PACKAGE_INIT@

默认写法

include(CMakeFindDependencyMacro)
find_dependency(OpenCV)

API消费者也需要使用的库的依赖传递

include("${CMAKE_CURRENT_LIST_DIR}/ImagePreprocessTargets.cmake")

常规写法

你可能感兴趣的:(c++,开发语言)