CMakeLists.txt的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的,参数和变量是大小写相关的,但,推荐全部使用大写指令。符号”#”后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格或分号进行间隔。变量使用${xxx}引用。常用cmakelists.txt文件构建cmake。如果工程存在多个目录,需要确保每个要管理的目录都存在一个CMakeLists.txt文件,这是CMake的构建定义文件。
一、linux下的安装和查看
1、安装软件
sudo apt-get install cmake
2、安装完成,查看版本
cmake --version
若出现对应的版本信息,则说明安装成功
二、语法
1、常用命令:
①aux_source_directory(<dir> <variable>)
该命令会把参数dir中所有的源文件(不包括头文件)名称赋值给参数variable;
②find_path(<VAR> name1[path1 path2 …])
该命令在参数path*指示的目录中查找文件name1并将查找到的路径保存在变量VAR中(其中使用”[…]”包含的项表示可忽略项,使用”…|…”分割的项表示只能选择其中一项);
③find_library(${var} NAMES name1[name2 …] PATHS path1 [path2 …] PATH_SUFFIXES suffix1 [uffix2 …])
搜索一个外部的链接库文件,并将结果的全部路径保存到var变量中。要搜索的链接库文件名字可能是name1,name2等;搜索路径为path1, path2等;此外还可以指定路径的后缀词为suffix1,suffix2等;
④find_package(name)
在指定的模块目录中搜索一个名为Find.cmake(例如,FindOSG.cmake)的CMake脚本模块文件,执行其中的内容,意图搜索到指定的外部依赖库头文件和库文件位置;
⑤ find_program
搜索一个外部的可执行程序;
⑥project(name)
指定项目名称name;
⑦include(file)
在当前文件中包含另一个CMake脚本文件的内容,用来载入CMakeLists.txt文件,也用于载入预定义的cmake模块;
⑧include_directories
指定头文件的搜索路径,用来向工程添加多个特定的头文件搜索路径,可以多次调用以设置多个路径,相当于指定gcc的-I参数;
⑨link_directories
添加非标准的共享库搜索路径,设置外部动态链接库或静态链接库的搜素路径,相当于gcc的-L参数;
⑩link_libraries
添加链接库;
⑪add_subdirectory
用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制文件存放的位置;
⑫add_executable
编译可执行程序,指定编译,好像也可以添加.o文件;
⑬add_definitions(-DMACRO1-DMACRO2 …)
添加编译参数,添加-D预编译宏定义,可以一次添加多个;
⑭add_dependencies
定义target依赖的其它target,确保在编译本target之前,其它的target已经被构建;
⑮add_library
可以设置要生成的链接库为SHARED或者STATIC,还可以设置MODULE(插件,可动态调用,但不作为其它工程的依赖);
⑯add_custom_target(name COMMANDcmd1 [COMMAND cmd2 ..])
添加一个名为name的编译目录,并指定一个或多个自定义的命令cmd1,cmd2等;注意ADD_CUSTOM_COMMAND与这个命令的区别:前者是针对一个已有的子工程进行自定义编译规则的设置;后者则是建立一个新的自定义的目标工程;
⑰target_link_libraries
可以用来为target添加需要链接的共享库,指定工程所用的依赖库,添加链接库,添加动态库或静态库,相当于指定-l参数;
⑱ message
打印消息,在控制台或者对话框输出一行或多行调试信息;
⑲set
定义一个用户自定义变量;
⑳set_target_properties
用来设置输出的名称,对于动态库,还可以用来指定动态库版本和API版本;
㉑cmake_minimum_required
设定依赖的cmake版本;
㉒ configure_file(infile outfile)
将文件infile复制到outfile的位置,同时执行其中变量的自动配置和更替;
㉓ install
安装目标工程到指定的文件夹,此命令用于定义安装规则,安装的内容可以包括目标二进制、动态库、静态库以及文件、目录、脚本等;
㉔ option(${var} “text” value)
向用户提供一个可选项,提示信息为text,初始值为value,并将最终的结果传递到var变量中;
㉕ enable_testing
用来控制Makefile是否构建test目标,涉及工程所有目录;
㉖exec_program
用于在指定的目录运行某个程序;
㉗execute_process
执行一个或多个子进程,按指定的先后顺序运行一个或多个命令;
㉘ file
文件操作命令;
2、内置变量和环境变量
①CMAKE_C_COMPILER
指定C编译器;
②CMAKE_CXX_COMPILER
指定C++编译器;
③CMAKE_C_FLAGS
指定编译C文件时的编译选项,如-g,也可以通过add_definitions添加编译选项;
④CMAKE_CXX_FLAGS
设置C++编译选项;
⑤CMAKE_BUILD_TYPE
build类型(Debug,Release,…),CMAKE_BUILD_TYPE=Debug;
⑥ CMAKE_COMMAND
CMake可执行文件本身的全路径;
⑦CMAKE_DEBUG_POSTFIX
Debug版本生成目标的后缀,通常可以设置为”d”字符;
⑧CMAKE_GENERATOR
编译器名称,例如”UnixMakefiles”, “Visual Studio 7”等;
⑨CMAKE_INSTALL_PREFIX
工程安装目录,所有生成和调用所需的可执行程序,库文件,头文件都会安装到该路径下,Unix/Linux下默认为/usr/local, windows下默认为C:\Program Files;
⑩CMAKE_MODULE_PATH
设置搜索CMakeModules模块(.cmake)的额外路径,用来定义自己的cmake模块所在的路径;
⑪CMAKE_CURRENT_SOURCE_DIR
指的是当前处理的CMakeLists.txt所在的路径;
⑫CMAKE_CURRENT_BINARY_DIR
如果是in-source编译,则跟CMAKE_CURRENT_SOURCE_DIR一致;如果是out-of-source,指的是target编译目录;
⑬CMAKE_CURRENT_LIST_FILE
输出调用这个变量的CMakeLists.txt的完整路径;
⑭CMAKE_CURRENT_LIST_LINE
输出这个变量所在的行;
⑮CMAKE_INCLUDE_CURRENT_DIR
自动添加CMAKE_CURRENT_BINARY_DIR和CMAKE_CURRENT_SOURCE_DIR到当前处理的CMakeLists.txt;
⑯CMAKE_INCLUDE_DIRECTORIES_PROJECT_EFORE
将工程提供的头文件目录始终至于系统头文件目录的前面,当你定义的头文件确定跟系统发生冲突时可以提供一些帮助;
⑰EXECUTABLE_OUTPUT_PATH
指定可执行文件的存放路径,最终结果的存放目录;
⑱LIBRARY_OUTPUT_PATH
指定库文件存放路径,最终结果的存放目录;
⑲BUILD_SHARED_LIBS
指定编译成静态库还是动态库;
⑳PROJECT_BINARY_DIR(CMAKE_BINARY_DIR)
如果是内部构建(in-sourcebuild),指的就是工程顶层目录;如果是外部构建(out-of-source build),指的是工程编译发生的目录;
㉑PROJECT_NAME
工程名称,即使用PROJECT命令设置的名称;
㉒PROJECT_SOURCE_DIR(CMAKE_SOURCE_DIR)
工程源代码文件所在的目录,指的是工程顶层目录;
㉓CYGWIN
标识当前系统是否为Cygwin;
㉔MSVC
标识当前系统是否使用MicrosoftVisual C;
㉕UNIX
标识当前系统是否为Unix系列(包括Linux、Cygwin和Apple);
㉖WIN32
标识当前系统是否为Windows及Win64;
3、语法
①#注释
②条件语句:
if(var)
…
else()/elseif()
…
endif(var)
③循环语句
Set(VAR a b c)
Foreach(f ${VAR}) …Endforeach(f)
④循环语句
WHILE() … ENDWHILE()
三、基本实例
1、简单例程
目录TEST1,只有一个main.c、CMakeLists.txt文件,目录基本如下
TEST1
main.c
CMakeLists.txt
其中
// TEST1/main.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("This is CMAKE_TEST1\n");
return 0;
}
# TEST1/CMakeLists.txt
cmake_minimum_required(VERSION 2.8) #最低要求版本为2.8
PROJECT(TEST1) #工程名称,不必须实际目录
add_executable(CMAKE_TEST1 main.c) #make生成执行可执行程序名称
执行cmake .(注意,后面有 ’ . ’ ,表示当前目录),控制窗口出现如下:
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
出现如下文件
CMakeCache.txt cmake_install.cmake main.c
CMakeFiles CMakeLists.txt Makefile
输入make,执行Makefile生成可执行程序,如下所示
CMakeCache.txt cmake_install.cmake CMAKE_TEST1 Makefile
CMakeFiles CMakeLists.txt main.c
2、同一目录,多个源文件
TEST2
main.c
Myadd.c
Myadd.h
CMakeLists.txt
//TEST2/main.c
#include <stdio.h>
#include <stdlib.h>
#include "Myadd.h"
int main()
{
int a=10,b=20;
int c=Myadd(a,b);
printf("c=%d\n",c);
printf("This is CMAKE_TEST2\n");
return 0;
}
//TEST2/Myadd.c
#include "Myadd.h"
int Myadd(int a,int b)
{
return (a+b);
}
//TEST2/Myadd.h
#include <stdio.h>
#include <stdlib.h>
int Myadd(int a,int b);
#TEST2/CMakeLists.txt
cmake_minimum_required(VERSION 2.8) #最低要求版本为2.8
PROJECT(TEST2) #工程名称,不必须实际目录
add_executable(CMAKE_TEST2 main.c Myadd.c) #make生成执行可执行程序名称
或者,也是可实现
CMakeLists.txt
cmake_minimum_required(VERSION 2.8) #最低要求版本为2.8
PROJECT(TEST2) #工程名称,不必须实际目录
aux_source_directory(. SRC) #读取当前文件下所有源文件
add_executable(CMAKE_TEST2_2 ${SRC}) #make生成执行可执行程序名称
3、不同目录,不同文件
TEST3
main.c
CMakeLists.txt
LIB
——Myadd.c
——Myadd.h
——CMakeLists.txt
不同的地方:
#TEST3/CMakeLists.txt
cmake_minimum_required(VERSION 2.8) #最低要求版本为2.8
PROJECT(TEST2) #工程名称,不必须实际目录
aux_source_directory(. SRC) #读取当前文件下所有源文件
add_subdirectory(LIB) #指向当前源文件的子目录
include_directories(LIB) #指向当前的头文件存放目录
add_executable(CMAKE_TEST3 ${SRC}) #make生成执行可执行程序名称
target_link_libraries(CMAKE_TEST3 Myadd) #指向链目录
#TEST3/LIB/CMakeLists.txt
aux_source_directory(. LIB_SOUR)
add_library(Myadd ${LIB_SOUR})
另一种方法,不需要LIB/CMakeLists.txt文件
#TEST3/CMakeLists.txt
cmake_minimum_required(VERSION 2.8) #最低要求版本为2.8
PROJECT(TEST2) #工程名称,不必须实际目录
aux_source_directory(. SRC) #读取当前文件下所有源文件
aux_source_directory(LIB SRC2) #读取当前文件下所有源文件
#add_subdirectory(LIB) #指向当前源文件的子目录
include_directories(LIB) #指向当前的头文件存放目录
add_executable(CMAKE_TEST3 ${SRC} ${SRC2}) #make生成执行可执行程序名称
#target_link_libraries(CMAKE_TEST3 Myadd) #指向链目录