cmake package 示例
使用cmake经常需要使用package生命外部依赖,经常遇到find_package报错的情况,有的是没有提供cmake包的支持,这时可以自行创建对cmake包的支持,方便使用。
cmake package有两种方式,一种为编写Find.cmake模块文件,即Find-module Package,另一种是编写Config.cmake文件,即Config-file Package。
Find-module Package 示例
一般就是使用find_path查找头文件目录,使用find_library查找库文件,使用find_package_handle_standard_args检查变量值是否有效并自动设置其他变量,如_FOUND。例如:
set(_sdl_search_dirs ${SDL2_ROOT}
$ENV{USERPROFILE}/AppData/Local/SDL2
/usr/local
/usr
"C:/Program Files/SDL2"
"C:/Program Files (x86)/SDL2")
find_path(SDL2_INCLUDE_DIR
NAMES SDL2/SDL.h
PATHS ${_sdl_search_dirs}
PATH_SUFFIXES include)
find_library(SDL2_LIB
NAMES SDL2
PATHS ${_sdl_search_dirs}
PATH_SUFFIXES lib)
mark_as_advanced(SDL2_LIB)
find_library(SDL2main_LIB
NAMES SDL2main
PATHS ${_sdl_search_dirs}
PATH_SUFFIXES lib)
mark_as_advanced(SDL2main_LIB)
find_library(SDL2_IMAGE_LIB
NAMES SDL2_image
PATHS ${_sdl_search_dirs}
PATH_SUFFIXES lib)
mark_as_advanced(SDL2_IMAGE_LIB)
set(SDL2_LIBS ${SDL2_LIB} ${SDL2main_LIB} ${SDL2_IMAGE_LIB} CACHE PATH "")
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(SDL2 DEFAULT_MSG SDL2_INCLUDE_DIR SDL2_LIBS)
find_path和find_library的结果变量会自动CACHE,也就是在cmake-gui中可以看见,mark_as_advanced会使变量需要在cmake-gui中需要勾选Advanced才能看到。
网上也有人编写了大量的find-module代码,一般的库都可以直接搜索到别人的代码。
使用时有两种方法,一种是放到cmake全局模块路径下,不常用;另一种是放到代码子目录下,并在cmake中设置CMAKE_MODULE_PATH
变量,例如:
# cmake文件在cmake子目录下
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake)
Config-file Package
现在对Config-file Package了解比较少,感觉使用起来比Find-module Package简单,因为自己编写的一半不需要做跨平台处理,不同平台编写不同的文件即可。例如:
set(SDL2_ttf_INCLUDE_DIR ${CMAKE_CURRENT_LIST_DIR}/include)
set(SDL2_ttf_LIBS ${CMAKE_CURRENT_LIST_DIR}/lib/SDL2_ttf.lib)
一般都是只需要设置两个变量,一个包含路径,一个库文件路径。