CMake配置工程链接库
CMake是一款优秀的C/C++项目构建工具。而C/C++项目经常使用一些第三方库,如boost、luajit等。而在CMake下大致有3种方式将C/C++库引入工程。
find_package
find_package是CMake原生使用的库查找命令。使用方式如下
find_package(Boost REQUIRED)
find_package(SDL2 REQUIRED)
if(Boost_FOUND) #这些变量的名称没有标准,去CMakeCache.txt里看产生什么变量。
message(STATUS "found boost")
endif()
include_directories(${Boost_INCLUDE_DIRS}) #这个类型变量肯定会有,头文件目录
target_link_libraries(CruleEngine "${SDL2_IMAGE_LIBRARY}") #这是库的位置
1
2
3
4
5
6
7
这个查找主要是在unix下起作用,在windows下几乎没用。它是其实是通过一个.cmake的配置文件,来找到对应的库文件的位置。cmake本身内置了一些知名的库的.cmake配置文件,如boost。
具体支持哪些,可以通过
cmake --help-module-list
1
或者在下面的网址查看详细信息
https://cmake.org/cmake/help/v3.0/manual/cmake-modules.7.html
而想用不支持其他库的话,可以自己去看看别人的项目有没有提供。如果别人有提供,你可以拷贝过来,放到项目目录下,通过下面的方式指定module目录。
set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/modules/") #工程根目录的modules文件夹下
1
find_path & find_library
这个命令是用来查找包含指定文件的文件夹。比如下面的例子
find_path(GLIB_INCLUDE NAMES glib.h PATH_SUFFIXES "glib-2.0")
1
这里是找glib.h的文件的位置,然后它的位置在/usr/include/glib-2.0目录下,所以我们加了一个搜索前缀glib-2.0来搜索目录。默认情况下,它会搜索系统下面的几个目录,但是有时候也可以指定几个特定路径来搜索。
find_path(GD_INCLUDE NAMES glib.h PATH_SUFFIXES "glib-2.0"
PATHS /usr/local /usr/include
NO_DEFAULT_PATH)
1
2
3
比如这里的NO_DEFAULT_PATH就是要求不找系统默认的几个目录。而是找PATHS指定的路径。当然如果没有指定搜索目录,会有默认的查找目录,具体查看
https://cmake.org/cmake/help/v3.0/command/find_path.html
find_library也是一样。比如找glib2.0的库,示例如下:
# Linux下
SET(CMAKE_FIND_LIBRARY_PREFIXES "lib") #设置库的前缀
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a") #设置库的后缀
find_library(GLIB_LIB NAMES "glib-2.0")
# Windows下的前后缀
SET(CMAKE_FIND_LIBRARY_PREFIXES "")
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".lib" ".dll")
1
2
3
4
5
6
7
可以查看
https://cmake.org/cmake/help/v3.0/command/find_library.htm
FindPkgConfig
这个本身是Unix/Linux下的一种库的查找方式,它们可以通过pkg-config命令来找到库文件,它的使用方法如下
g++ luabind.cpp -o luabind `pkg-config --cflags --libs luajit`
1
而CMake也对这种查找方式进行了封装,使用方法如下
include(FindPkgConfig) #加载FindPkgConfig功能
pkg_check_modules(XCB xcb REQUIRED) #查找xcb库
target_link_libraries(app ${XCB_LDFLAGS}) #链接xcb库
1
2
3
注意这种方式需要库提供pkg索引文件,一般通过Linux包管理安装的库都会带有这个文件。
其他具体信息可以看
https://cmake.org/cmake/help/v3.0/module/FindPkgConfig.html