目录
前言、CMake是什么?
cmake的定义是什么 ?-----高级编译配置工具
当多个人用不同的语言或者编译器开发一个项目,最终要输出一个可执行文件或者共享库(dll,so等等)这时候神器就出现了-----CMake!
所有操作都是通过编译CMakeLists.txt来完成的—简单
cmake官 方网站,可以通过访问官方网站获得更多关于 cmake 的信息
一、CMake的安装
可以通过http://www.cmake.org/HTML/Download.html下载安装
二、使用步骤
1.创建CMakeLists.txt
2.在上述文件中编写构建规则
3.执行构建
Linux下执行命令:cmake . ---> 生成makefile文件 --> make .
windows下在CMakeLists.txt目录路径下打开终端:
新建一个目录:例如build -->
进入到新建的build目录下 -->
cmake -G "MinGW Makefiles" .. -->
cmake --build .
三、CMake常用语法
3.1创建项目
设置项目所需的最低cmake版本
cmake_minimum_required(VERSION <min>[...<policy_max>] [FATAL_ERROR])
设置项目名 (可选支持语言)
project(<PROJECT-NAME> [<language-name>...])
添加可执行文件
add_executable(<name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
[source1] [source2 ...])
将普通、缓存或环境变量设置为给定值。
set(<variable> <value>... [PARENT_SCOPE])
#复制请将注释全部删除
#指定最小cmake版本
cmake_minimum_required(VERSION 3.10)
#指定工程名字 并支持语言c与c++
project(abcd C CXX)
#设置变量 将cpp源文件用变量SRC_LIST表示
set(SRC_LIST main.cpp a.cpp b.cpp c.cpp d.cpp)
#生成可执行文件 testprogram
add_executable(testprogram ${SRC_LIST})
3.2创建静/动态库
添加库
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
[<source>...])
#工程名为HELLO
PROJECT(HELLO)
#将要生成库的源文件设置为变量LIBHELLO_SRC
SET(LIBHELLO_SRC hello.cpp)
#生成静态库
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})
#同时生成同名动静态库时需要添加,以防止命名冲突
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
#生成动态库
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
SET_TARGET_PROPERTIES(hello PROPERTIES OUTPUT_NAME "hello")
3.3工程链接库
#指定链接给定目标和/或其依赖项时要使用的库或标志
target_link_libraries(<target> ... <item>... ...)
#指定库的头文件位置(解决make报找不到头文件的error)
target_include_directories(Tutorial PUBLIC
"${PROJECT_BINARY_DIR}"
"${PROJECT_SOURCE_DIR}/MathFunctions"
)
#cmake内置变量
#项目 源目录的绝对路径
PROJECT_SOURCE_DIR, <PROJECT-NAME>_SOURCE_DIR
#项目 二进制目录的绝对路径
PROJECT_BINARY_DIR, <PROJECT-NAME>_BINARY_DIR
#例如有个外部的库头文件在/usr/local/include/Hello/ 下
INCLUDE_DIRECTORIES(/usr/include/hello)
#指定链接库的路径
LINK_DIRECTORIES(库的路径)
#为名为main的工程添加静态库hello
TARGET_LINK_LIBRARIES(main libhello.a)
总结:
以上便是cmake常用的语法,更多用法详情参照
[Cmake官方文档](https://cmake.org/cmake/help/latest/guide/tutorial/)