目录html
CMake是一种跨平台编译工具,用来生成makefile。CMake主要是编写CMakeLists.txt文件,而后用cmake命令执行CMakeLists.txt文件生成make所须要的makefile文件,最后用make命令编译源码生成可执行程序或库文件。
cmake 指向CMakeLists.txt所在的目录,例如cmake .. 表示CMakeLists.txt在当前目录的上一级目录。cmake后会生成不少编译的中间文件以及makefile文件,因此通常建议新建一个新的目录,专门用来编译,例如工具
mkdir ckbuild cd ckbuild cmake .. make
. ├── build ├── CMakeLists.txt ├── include │ └── xxx.h └── src ├── xxx.c └── main.c
编写CMakeLists.txt文件,该文件通常放在和src,include的同级目录ui
#1.cmake verson,指定cmake版本 cmake_minimum_required(VERSION 3.5) #2.project name,指定项目的名称,通常和项目的文件夹名称对应 PROJECT(findstr) #3.head file path,头文件目录 INCLUDE_DIRECTORIES( include ) #4.source directory,源文件目录 AUX_SOURCE_DIRECTORY(src DIR_SRCS) #5.set environment variable,设置环境变量,编译用到的源文件所有都要放到这里,不然编译可以经过,可是执行的时候会出现各类问题,好比"symbol lookup error xxxxx , undefined symbol" SET(TEST_MATH ${DIR_SRCS} ) #6.add executable file,添加要编译的可执行文件 ADD_EXECUTABLE(${PROJECT_NAME} ${TEST_MATH}) #7.add link library,添加可执行文件所须要的库,好比咱们用到了libm.so(命名规则:lib+name+.so),就添加该库的名称 #TARGET_LINK_LIBRARIES(${PROJECT_NAME} m)
设置常规变量
set(<variable> <value>... [PARENT_SCOPE])
设置环境变量
set(ENV{<variable>} <value>...)
.net
include(<file|module> [OPTIONAL] [RESULT_VARIABLE <VAR>] [NO_POLICY_SCOPE])
从一个文件或模块加载而且运行cmake代码debug
add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
用指定的源文件建立一个可执行文件
建立一个名字为name 的可执行文件,name 在一个工程内必须是全局惟一的,可执行文件的实际名字会根据所在平台重新构造,
(such as <name>.exe or just <name>)
.调试
add_library Normal Libraries Imported Libraries Object Libraries Alias Libraries Interface Libraries
Normal Libraries
add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
建立一个名字为name 的库,name 在一个工程内必须是全局惟一的,实际名字会根据所在平台进行转化,
(such as lib<name>.a or <name>.lib).
库的类型也许被指定为:STATIC, SHARED, or MODULE
。静态库在连接到其它文件的时候被使用,动态库是动态连接在运行时加载,
MODULE
库不被连接到别的文件,也许在运行时被加载。
若是没有说明是静态仍是共享,则依据变量BUILD_SHARED_LIBS
是否打开来肯定类型。
若是变量BUILD_SHARED_LIBS
没有使用,默认是静态库,用法示例:code
add_library(archive SHARED archive.cpp zip.cpp lzma.cpp) add_library(archive STATIC archive.cpp zip.cpp lzma.cpp)
aux_source_directory(<dir> <variable>)
把目录“dir”中的全部源文件的名字存在变量"variable"中。orm
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
为编译器器添加头文件的搜索路径,这些头文件目录将被添加到当前的CMakeLists文件的INCLUDE_DIRECTORIES
属性中。server
project(<PROJECT-NAME> [LANGUAGES] [<language-name>...]) project(<PROJECT-NAME> [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]] [DESCRIPTION <project-description-string>] [LANGUAGES <language-name>...])
为整个工程设置名称,版本,和使用的语言。
设置的工程名存储在变量PROJECT_NAME
中。
cmake_minimum_required(VERSION major.minor[.patch[.tweak]] [FATAL_ERROR])
这个命令放在 CMakeLists.txt 的最前面,为工程设定最低的cmake版本。
若是cmake版本低于要求,会中止编译,并报错。
(ref)[https://www.linuxidc.com/Linux/2014-03/98622.htm]
三 生成可调试版本的程序
1使用CMAKE编译确实很方便。但CMAKE默认编译出来的程序不带有符号文件,用GDB没法调试。
2 要编译时产生符号文件供调试,调用CMAKE时,带上 -DCMAKE_BUILD_TYPE=Debug
例如:在build文件中输入:
cmake .. -DCMAKE_BUILD_TYPE=Debug
这样产生的makefile文件make生成的可执行文件就带有调试信息,供gdb和gdbserver使用了。
*****另外有另外一种更好的方法是在工程主CMakeLists.txt中的PROJECT语句后加入一句
SET(CMAKE_BUILD_TYPE Debug)
CMake 中有一个变量 CMAKE_BUILD_TYPE ,能够的取值是 Debug Release RelWithDebInfo 和 MinSizeRel。当这个变量值为 Debug 的时候,CMake 会使用变量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG 中的字符串做为编译选项生成 Makefile ,当这个变量值为 Release 的时候,工程会使用变量 CMAKE_CXX_FLAGS_RELEASE 和 CMAKE_C_FLAGS_RELEASE 选项生成 Makefile。
编译时需添加-gdwarf-2和-g3两个参数。
加了-g3的参数后,gcc编译的时候,会将扩展的debug 信息编译进二进制文件里面,包括宏定义信息。