cmake package示例

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)

一般都是只需要设置两个变量,一个包含路径,一个库文件路径。

你可能感兴趣的:(cmake)