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