本文是个人探究API封装成Package以让他人像使用OpeCV,PCL等第三方库那样方便时所总结的经验。
cmake_minimum_required(VERSION x.x) #最小Cmake版本要求
projiect() #工程名称
find_package() #引入第三方库
add_library() #编译代码为库文件,SHARED标志可以指定为动态库
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到指定目录
@PACKAGE_INIT@
默认写法
include(CMakeFindDependencyMacro)
find_dependency(OpenCV)
API消费者也需要使用的库的依赖传递
include("${CMAKE_CURRENT_LIST_DIR}/ImagePreprocessTargets.cmake")
常规写法