这篇文章上次修改于 2119 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
CMake 使用笔记
CMake
维基百科 官方文档CMake
是个一个开源的跨平台自动化建构系统,可以方便的生成各种工程项目。功能强大,不过由于很多时候不会经常写CMakeLists
也导致很容易忘记用法,经常是在使用时再通过搜索引擎查找某一用法,为了降低每次使用时的检索成本,维护一个备忘录,将一些简单的用法做下记录。并添加代码示例。
该项目为个人记录一些 CMake 的简单用法,属于备忘录性质。方便自己检索使用。
生成动态库
#设置 CMake 最低版本要求
cmake_minimum_required(VERSION 3.10)
#设置项目名称
project( add )
#自动查找 . 目录下的源码文件,并将文件名存储到SRC变量中
# aux_source_directory(<dir> <variable>)
aux_source_directory(. SRC )
#最后生成库 add ,SHARED 指定生成动态库
# add_library(<name> [STATIC | SHARED | MODULE]
# [EXCLUDE_FROM_ALL]
# [source1] [source2 ...])
add_library(add SHARED ${SRC} )
文档链接:
cmake_minimum_required
project
aux_source_directory
add_library
生成静态库
cmake_minimum_required(VERSION 3.10)
project( add )
aux_source_directory(. SRC )
# 内容基本同生成动态库, 在最后生成库时不加 SHARED 表明生成默认库,默认为静态库
add_library(add ${SRC} )
生成可执行文件
cmake_minimum_required(VERSION 3.10)
project( demo )
# add_executable 为生成可执行文件
# add_executable(<name> [WIN32] [MACOSX_BUNDLE]
# [EXCLUDE_FROM_ALL]
# [source1] [source2 ...])
add_executable(demo demo.cpp)
文档链接:
add_executable
链接静态库
cmake_minimum_required(VERSION 3.10)
project( useStaticLib )
# 添加 include 查找目录
# include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
# 默认情况下添加在当前查找目录列表的最后
include_directories( ../static_lib )
# 添加链接库查找目录
# link_directories([AFTER|BEFORE] directory1 [directory2 ...])
link_directories( ../static_lib/build )
add_executable( useStaticLib useStaticLib.cpp )
# 将目标文件与库文件进行链接
# target_link_libraries(<target> ... <item>... ...)
target_link_libraries( useStaticLib add )
文档链接:
include_directories
include_directories
target_link_libraries
链接动态库
# 内容同链接静态库, 运行时需要动态库文件
cmake_minimum_required(VERSION 3.10)
project( useDynamicLib )
include_directories( ../dynamic_lib )
link_directories( ../dynamic_lib/build )
add_executable( useDynamicLib useDynamicLib.cpp )
target_link_libraries( useDynamicLib add )
安装静态库文件及对应头文件
cmake_minimum_required(VERSION 3.10)
project( add )
add_library( add add.cpp )
# 安装目标到指定文件夹,用法如下
# install(TARGETS <target>... [...])
# install({FILES | PROGRAMS} <file>... DESTINATION <dir> [...])
# install(DIRECTORY <dir>... DESTINATION <dir> [...])
# install(SCRIPT <file> [...])
# install(CODE <code> [...])
# install(EXPORT <export-name> DESTINATION <dir> [...])
# RUNTIME: 可执行文件
# ARCHIVE: 静态库
# LIBRARY: 动态库
install(TARGETS add
ARCHIVE DESTINATION /usr/local/lib/
)
install(FILES add.hpp DESTINATION /usr/local/include )
文档链接
install
安装动态库文件及对应头文件
cmake_minimum_required(VERSION 3.10)
project( add )
add_library( add SHARED add.cpp )
# 内容基本同上
# LIBRARY: 该参数指定为动态库文件
install(TARGETS add
LIBRARY DESTINATION /usr/local/lib
)
install(FILES add.hpp DESTINATION /usr/local/include )
模块的使用及自定义模块
使用 find_package
cmake_minimum_required(VERSION 3.10)
project( main )
# 设置 CMake 查找module的文件路径
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake )
# 查找 ADD 库
# find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
# [REQUIRED] [[COMPONENTS] [components...]]
# [OPTIONAL_COMPONENTS components...]
# [NO_POLICY_SCOPE])
find_package(ADD)
# 在 FindADD.cmake 文件中会定义 ADD_FOUND 变量用于判断是否查找成功
# 在查找成功后会添加 ${ADD_INCLUDE_DIR} 头文件查找路径, 和 ${ADD_LIBRARY} 库文件名两个变量
if(ADD_FOUND)
include_directories(${ADD_INCLUDE_DIR})
else(ADD_FOUND)
message(FATAL_ERROR "ADD library not fount")
endif(ADD_FOUND)
add_executable( main main.cpp )
target_link_libraries(main ${ADD_LIBRARY} )
文档链接
find_package
Find 模块编写
# 查找文件名,及查找路径路径,查找成功会将路径设置到 ADD_INCLUDE_DIR 变量中
# find_path (<VAR> name1 [path1 path2 ...])
find_path(ADD_INCLUDE_DIR add.hpp /usr/local/include /usr/include )
# 查找库文件名,及查找路径,查找成功会将库文件路径设置到 ADD_LIBRARY 变量中
# find_library (<VAR> name1 [path1 path2 ...])
find_library(ADD_LIBRARY NAMES add PATH /usr/local/lib /usr/lib/ )
# 如果查找成功设置 ADD_FOUND 变量为 true
if(ADD_INCLUDE_DIR AND ADD_LIBRARY)
set(ADD_FOUND true)
endif(ADD_INCLUDE_DIR AND ADD_LIBRARY
if(ADD_FOUND)
if(NOT ADD_FIND_QUIETLY)
message(STATUS "Found add: ${ADD_LIBRARY}")
endif(NOT ADD_FIND_QUIETLY)
else(ADD_FOUND)
if(ADD_FIND_REQUIRED)
message(FATAL_ERROR "Could not find hello library")
endif(ADD_FIND_REQUIRED)
endif(ADD_FOUND)
文档链接
find_library
没有评论