type
status
date
slug
summary
tags
category
icon
password
构建可执行程序
add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] [source1] [source2 ...])
如:
add_executable(${PROJECT_NAME} main.cpp)
或者源码目录:
aux_source_directory(${CMAKE_CURRENT_LIST_DIR} DIR_SOURCES) add_executable(${PROJECT_NAME} ${DIR_SOURCES})
构建动态链接库/静态库
add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] [source1] [source2 ...])
STATIC
:表示静态库,如libname.a
SHARED
:表示动态链接库,如libname.dylib
MODULE
:表示可以用类似dlopen
得方法动态加载库,如libname.so
构建出来的库名字会自动加上
lib
前缀,如libname.a
libname.dylib
libname.so
如:
add_library(${PROJECT_NAME} SHARED main.cpp)
添加头文件
include_directories(include_dir)
include_dir
为.h
文件所在的文件夹添加源文件
aux_source_directory(./src DIR_SOURCES)
查找把
./src
下所有源文件,并保存到变量DIR_SOURCES
中,后面可以使用${DIR_SOURCES}
表示.需要注意的地方是:
aux_source_directory
不会递归包含子目录,仅包含指定的目录.
- 当添加源文件时,如需重新编译,得重新运行cmake
还可以使用
CMAKE_CURRENT_LIST_DIR
内置变量:aux_source_directory(${CMAKE_CURRENT_LIST_DIR} DIR_SOURCES)
添加子目录
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
除了写helloworld,一般都需要配置多个源码目录,这个时候可以使用
add_subdirectory
命令,其中source_dir
表示子目录中CMakeList.txt所在的路径,binary_dir
表示输出目录.查找依赖库
- 通过
link_directories
(极少使用)
link_directories([AFTER|BEFORE] directory1 [directory2 ...])
linker会在这些定义的目录里查找依赖的库.如lib文件夹下放置一个
libskia.so
库文件:link_directories(${CMAKE_CURRENT_LIST_DIR}/lib)
最后链接的时候:
target_link_libraries(${PROJECT_NAME} skia)
这个时候,会自动到上面包含的lib文件下去寻找libskia.so(或者libskia.a,libskia.dylib)文件.
使用XCode等项目生成器需要根据架构动态切换依赖库,或者库本身依赖私库等情况会使用这个命令,一般使用find_library()替换.
- 通过
find_library
find_library (<VAR> name1 [path1 path2 ...])
如果库被找到,结果会被存储到变量
VAR
中.如果没有找到库文件,则结果会被存储到<VAR>-NOTFOUND
.如:find_library(LIB_SKIA skia lib) if(LIB_SKIA-NOTFOUND) message("没有找到Skia") endif(LIB_SKIA-NOTFOUND) target_link_libraries(${PROJECT_NAME} ${LIB_SKIA})
- 通过
find_package
find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE] [REQUIRED] [[COMPONENTS] [components...]] [OPTIONAL_COMPONENTS components...] [NO_POLICY_SCOPE])
cmake中自带了一些cmake脚本,通过
cmake --help-module-list
命令即可查看.拿libpng举例:add_executable(${PROJECT_NAME} ${DIR_SOURCES}) find_package(PNG) if(PNG_FOUND) include_directories(${PNG_INCLUDE_DIR}) target_link_libraries(${PROJECT_NAME} ${PNG_LIBRARY}) message("找到了PNG") endif(PNG_FOUND) if(NOT PNG_FOUND) message("没有找到PNG") endif(NOT PNG_FOUND)
如果遇到已有脚本存在,但是就是无法找到的情况,无需在此浪费时间,换一种查找方法即可.
链接库文件
target_link_libraries(<target> ... <item>... ...)
这其中item可以是下面的任何一种:
- 库名(不带
lib
前缀,不带后缀)
target_link_libraries(${PROJECT_NAME} skia)
- 库文件的完整路径
- 表达式
自定义输出路径
- 指定执行文件输出路径
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_LIST_DIR}/build)
CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE
- 指定库文件输出路径
LIBRARY_OUTPUT_PATH
CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE
set(CMAKE_DEBUG_POSTFIX "_d") set(CMAKE_RELEASE_POSTFIX "_r")
内置变量
- CMAKE_CURRENT_LIST_DIR
当前CMakeList.txt所在目录
- PROJECT_NAME
项目名
PROJECT_SOURCE_DIR
源码目录
- 作者:姜康
- 链接:https://jiangkang.tech/article/e4af61e7-e3ed-4559-b80c-b01f3c039bcb
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。