1、cmake特点
-
基本语法格式:指令(参数1 参数2 …)
。参数用括号括起来;
。参数之间用空格和分号分开; -
指令是大小写无关,参数和变量是大小写敏感的
set(HELLO hello.cpp) #set变量 add_executable(hello main.cpp hello.cpp) ADD_EXECUTABLE(hello main.cpp ${HELLO}) #这一句和上一句一样
-
使用
${}
方式取值,但是在if
控制语句直接使用变量名
2、cmake重要指令
-
cmake_minimum_required()
指定CMake最小版本#语法 cmake_minimum_required(VERSION versionNumber [FATAL_ERROR]) #示例 cmake最小版本2.8 cmake_minimum_required(VERSION 2.8)
-
project()
定义工程名称,并可以指定工程支持语言#语法 project(projectName [CXX] [C] [Java]) #示例 指定工程名HELLOWORLD project(HELLOWORLD)
-
set()
显式定义变量#语法 set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]) #示例 定义SRC变量,其值为sayhello.cpp hello.cpp set(SRC sayhello.cpp hello.cpp)
-
include_directories()
向工程添加多个特定的头文件搜索路径 “头文件目录” ,相当与指定g++
编译器的-I
参数#语法 include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...) #示例 将/usr/include /usr/local/include ./include添加到头文件搜索路径 include_directories(/usr/include /usr/local/include ./include)
-
link_directories()
向工程添加多个特定的库文件搜索路径 “链接库目录” ,相当与指定g++
编译器的-L
参数#语法 link_directories(dir1 dir2 ...) #示例 将/usr/lib ./lib添加到库文件搜索路径 link_directories(/usr/lib ./lib)
-
add_library()
生成库(library)文件#语法 add_library(libName [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 aource2 ...) #示例 通过变量SRC生成libhello.so共享(动态)库 add_library(hello SHARED ${SRC})
-
add_compile_options()
添加编译参数#语法 add_compile_options(<option> ...) #示例 add_compile_options(-wall -std=c++11 -o2)
-
add_executable()
生成可执行文件#语法 add_executable(exeName source1 source2 ...) #示例 main.cpp成可执行文件main add_executable(main main.cpp)
-
target_link_libraries()
为target添加需要链接的共享(动态)库
动态库需要链接,静态库编译时已经添加进去了#语法 target_link_libraries(target library1<debug|optimized> library2...) #示例 将hello共享库链接到可执行文件main target_link_libraries(main hello)
-
add_subdirectory()
向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制的位置#语法 add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL]) #示例 添加src子目录, ## src中需要有个CMakeLists.txt文件 add_subdirectory(src)
-
aux_source_directory()
发现一个目录下所有源代码文件并将列表存储在一个变量中,这个指令临时被用来构建源文件列表#语法 aux_source_directory(dir VARIABLE) #示例 #定义SRC变量,其值为当前目录下所有的源代码文件 aux_source_directory(. SRC) #编译SRC变量所代表的源文件代码,生成main可执行文件 add_executable(main ${SRC})
3、CMake常用变量
-
CMAKE_C_FLAGS
:gcc
编译选项 -
CMAKE_CXX_FLAGS
:g++
编译选项追加,“${CMAKE_CXX_FLAGS} ...”,类似bash的path=${path}:...
# 在CMAKE_CXX_FLAGS编译选项后追加-std=c++11 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
-
CMAKE_BUILD_TYPE
编译类型 (Debug, Release)# 设定编译类型为debug,调试时需要选择debug set(CMAKE_BUILD_TYPE Debug) # 设定编译类型为release,发布时选择release set(CMAKE_BUILD_TYPE Release)
-
CMAKE_BINARY_DIR
PROJECT_BINARY_DIR
<projectname>_BINARY_DIR
1.这三个变量指代的内容是一致的 2.如果是in source build,指的就是工程顶层目录 3.如果是out-of-source编译,指的是工程编译发生的目录 4.PROJECT_BINARY_DIR跟其他指令稍有区别
-
CMAKE_SOURCE_DIR
PROJECT_SOURCE_DIR
<projectname>_SOURCE_DIR
1.这三个变量指代的内容也是一致的,不论采用何种编译方式,都是工程顶层目录 2.也就是在in source build时,和CMAKE_BINARY_DIR等变量一致 3.PROJECT_SOURCE_DIR跟其他指令稍有区别
-
CMAKE_C_COMPILER
: 指定C编译器 -
CMAKE_CXX_COMPILER
: 指定C++编译器 -
EXECUTABLE_OUTPUT_PATH
: 可执行文件输出的存放路径 -
LIBRARY_OUTPUT_PATH
: 库文件输出的存放路径
4、CMake编译工程
CMake目录结构:项目主目录存在一个CMakeLists.txt文件
两种方式设置编译规则:
1. 包含源文件的子文件夹**包含**CMakeLists.txt, 主目录的CMakeLists.txt通过add_subdirectory()添加子目录即可;
3. 包含源文件的子文件夹**未包含**CMakeLists.txt文件,子目录编译规则体现在主目录的CMakeLists.txt;
-
编译流程
#主目录 mkdir build cd build cmake .. #生成Makefile文件 make
-
两种构建方式
(1)内部构建(in-source build):不推荐使用内部构建就是直接在CMakeLists.txt目录cmake . 生成一堆中间文件
cmake . make
(2) 外部构建(out-of-source build):推荐
将编译输出文件与源文件放在不同目录mkdir build && cd build cmake .. make