添加第三方库
添加第三方库需要使用以下配置项指定第三方库的头文件和库文件位置。
# 指定头文件位置到变量
set(INC_DIR /usr/local/include)
# 指定库文件位置到变量
set(LINK_DIR /usr/local/lib)
# 将以上两个位置包含进来
include_directories(${INC_DIR})
# link_directories相当于gcc命令中的 -L 参数
link_directories(${LINK_DIR})
# 包含指定库名称,以下包含了库名称为libev.so的库
link_libraries(ev)
# 将指定库与项目进行链接
# target_link_libraries相当于gcc命令中的 -l 参数
# 只需要书写库名,即 libxx.so 中间的xx部分
target_link_libraries(demo ev)
此外还可以使用find_file
和find_library
来寻找相应的库。这两个函数可以在系统或者指定路径中寻找相应的头文件和库文件,并将其路径保存到目录中,供项目包含使用,例如:
# 查找SDL.h,在包含SDL2的目录里
find_file(SDL2_INCLUDE_DIR NAME SDL.h HINTS SDL2)
# 查找名字包含SDL2的库文件
find_library(SDL2_LIBRARY NAME SDL2)
add_executable(Demo main.cpp)
# 向项目添加包含头文件的目录
target_include_directories(Demo ${SDL2_INCLUDE_DIR})
# 链接指定库
target_link_libraries(Demo ${SDL2_LIBRARY})
find_file
命令常用的格式如下:
find_file(
<VAR>
name | NAMES name1 [name2 ... ]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
)
find_library
命令常用的格式如下:
find_library(
<VAR>
name | NAMES name1 [name2 ... ] [NAMES_PER_DIR]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
)
在这两个命令中,命令的格式都是基本共通的,其中的参数含义如下:
<VAR>
,查找到的目标文件或者库文件路径要存储到的变量。NAMES
,提供一系列可能的名称供查找。HINTS
,提供一系列可能的路径名称供查找。PATHS
,提供一系列可能的完整路径供查找。PATH_SUFFIXES
,提供一系列附加的子目录供检查。
借助 CMake 的 Module 定位第三方库
CMake 在进行第三方库查找时一般都是通过find_file
寻找头文件,find_library
寻找库文件,所以在进行查找时都需要编写两个查找命令。但实际上头文件和库文件集合在一起是可以被看做一个模块的,所以 CMake 提供了内置的模块查找功能,可以直接根据特征完成库文件和相应头文件的查找,这就是find_package
。
在 CMake 的 Module 目录下提供了数量众多的.cmake
文件,针对常用的第三方库定义了其头文件和库文件的查找方式。可以通过命令行中的命令cmake -help-module-list
来得到目前系统中安装的 CMake 支持的模块列表。所有被 CMake 支持的模块一般都是以FindXXX.cmake
格式命名的,例如FindBZip2.cmake
,在使用时只需要使用命令find_package(BZip2)
即可,在后面就可以通过BZIP2_INCLUDE_DIR
和BZIP2_LIBRARIES
变量来访问乡音的路径。模块定义的路径可以通过命令cmake --help-module 模块名称
来查看。
find_package
的常用命令格式如下。
find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
[REQUIRED] [[COMPONENTS] [components ... ]]
[OPTIONAL_COMPONENTS components ... ]
)
借助 Pkg-Config 定位第三方库
许多第三方库都使用 Pkg-Config 维护所依赖的库路径、头文件路径、编译选项、链接选项等,可以方便第三方开发者便捷的获取相关信息。CMake 中通过FindPkgConfig
模块提供了对于 Pkg-Config 的使用。
要在配置中使用 Pkg-Config,需要使用命令find_package(PkgConfig)
启动所有 Pkg-Config 命令。FindPkgConfig
命令提供了以下两个常用命令来供定位第三方库使用。
pkg_check_module(<prefix>
[REQUIRED] [QUIET] [NO_CMAKE_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[IMPORTED_TARGET [GLOBAL]]
<moduleSpec> [<moduleSpec> ...]
)
命令pkg_search_module
与pkg_check_module
拥有完全相同的命令格式,区别是pkg_search_module
只会获取第一个匹配到的模块的信息。
命令中的prefix
一般是用来指示要搜索的库名称的,命令在获取匹配后给出的匹配库路径也是由prefix
来命名的,这与find_package
的特性是一样的。
命令中的moduleSpec
可以用来定义要取得的模块的版本,在使用时需要使用库的具体名称通过比较操作符搭配版本号的形式,例如以下形式都是有效的。
glib-2.0>=2.10
,获取库 glib-2.0 至少 2.10 以上的版本的库信息。glib-2.0
,获取任意版本的 glib-2.0 的库信息。