| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> Linux CMake详解和使用范例一 -> 正文阅读 |
|
[系统运维]Linux CMake详解和使用范例一 |
????????CMake是一个跨平台的编译自动配置工具,它使用一个名为CMakeLists.txt的文件来描述构建过程,可以产生标准的构建文件。它可以用简单的语句来描述所有平台的安装(编译过程)。它能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。CMake并不直接建构出最终的软件,而是产生标准的建构档(如Unix的Makefile或Windows Visual C++的projects/workspaces),然后再依一般的建构方式使用。 ????????CMake的组态档取名为CMakeLists.txt。组态档是用一种建构软件专用的特殊编程语言写的CMake脚本。文件CMakeLists.txt需要手工编写,也可以通过编写脚本进行半自动的生成。通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程。 ???????? CMakeLists.txt的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的,参数和变量是大小写相关的,但,推荐全部使用大写指令。符号”#”后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格或分号进行间隔。变量使用${xxx}引用。 常用命令说明: 1.??????aux_source_directory(<dir><variable>) :该命令会把参数<dir>中所有的源文件(不包括头文件)名称赋值给参数<variable>; 2.??????find_path(<VAR> name1[path1 path2 …]):该命令在参数path*指示的目录中查找文件name1并将查找到的路径保存在变量VAR中(其中使用”[…]”包含的项表示可忽略项,使用”…|…”分割的项表示只能选择其中一项); 3.??????find_library(${var} NAMES name1[name2 …] PATHS path1 [path2 …] PATH_SUFFIXES suffix1 [uffix2 …]):搜索一个外部的链接库文件,并将结果的全部路径保存到var变量中。要搜索的链接库文件名字可能是name1,name2等;搜索路径为path1, path2等;此外还可以指定路径的后缀词为suffix1,suffix2等; 4.??????find_package(name):在指定的模块目录中搜索一个名为Find<name>.cmake(例如,FindOSG.cmake)的CMake脚本模块文件,执行其中的内容,意图搜索到指定的外部依赖库头文件和库文件位置; 5.??????find_program:搜索一个外部的可执行程序; 6.??????project(name):指定项目名称name; 7.??????include(file):在当前文件中包含另一个CMake脚本文件的内容,用来载入CMakeLists.txt文件,也用于载入预定义的cmake模块; 8.??????include_directories:指定头文件的搜索路径,用来向工程添加多个特定的头文件搜索路径,可以多次调用以设置多个路径,相当于指定gcc的-I参数; 9.??????link_directories:添加非标准的共享库搜索路径,设置外部动态链接库或静态链接库的搜素路径,相当于gcc的-L参数; 10.??link_libraries:添加链接库; 11.??add_subdirectory:用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制文件存放的位置; 12.??add_executable:编译可执行程序,指定编译,好像也可以添加.o文件; 13.??add_definitions(-DMACRO1-DMACRO2 …):添加编译参数,添加-D预编译宏定义,可以一次添加多个; 14.??add_dependencies:定义target依赖的其它target,确保在编译本target之前,其它的target已经被构建; 15.??add_library:可以设置要生成的链接库为SHARED或者STATIC,还可以设置MODULE(插件,可动态调用,但不作为其它工程的依赖); 16.??add_custom_target(name COMMANDcmd1 [COMMAND cmd2 ..]):添加一个名为name的编译目录,并指定一个或多个自定义的命令cmd1,cmd2等;注意ADD_CUSTOM_COMMAND与这个命令的区别:前者是针对一个已有的子工程进行自定义编译规则的设置;后者则是建立一个新的自定义的目标工程; 17.??target_link_libraries:可以用来为target添加需要链接的共享库,指定工程所用的依赖库,添加链接库,添加动态库或静态库,相当于指定-l参数; 18.??message:打印消息,在控制台或者对话框输出一行或多行调试信息; 19.??set:定义一个用户自定义变量; 20.??set_target_properties:用来设置输出的名称,对于动态库,还可以用来指定动态库版本和API版本; 21.??cmake_minimum_required:设定依赖的cmake版本; 22.??configure_file(infile outfile):将文件infile复制到outfile的位置,同时执行其中变量的自动配置和更替; 23.??install:安装目标工程到指定的文件夹,此命令用于定义安装规则,安装的内容可以包括目标二进制、动态库、静态库以及文件、目录、脚本等; 24.??option(${var} “text” value):向用户提供一个可选项,提示信息为text,初始值为value,并将最终的结果传递到var变量中; 25.??enable_testing:用来控制Makefile是否构建test目标,涉及工程所有目录; 26.??exec_program:用于在指定的目录运行某个程序; 27. execute_process:执行一个或多个子进程,按指定的先后顺序运行一个或多个命令; 28.??file:文件操作命令; ? 内置变量、环境变量: 1.??????CMAKE_C_COMPILER:指定C编译器; 2.??????CMAKE_CXX_COMPILER:指定C++编译器; 3.??????CMAKE_C_FLAGS:指定编译C文件时的编译选项,如-g,也可以通过add_definitions添加编译选项; 4.??????CMAKE_CXX_FLAGS:设置C++编译选项; 5.??????CMAKE_BUILD_TYPE:build类型(Debug,Release,…),CMAKE_BUILD_TYPE=Debug; 6.??????CMAKE_COMMAND:也就是CMake可执行文件本身的全路径; 7.??????CMAKE_DEBUG_POSTFIX:Debug版本生成目标的后缀,通常可以设置为”d”字符; 8.??????CMAKE_GENERATOR:编译器名称,例如”UnixMakefiles”, “Visual Studio 7”等; 9.??????CMAKE_INSTALL_PREFIX:工程安装目录,所有生成和调用所需的可执行程序,库文件,头文件都会安装到该路径下,Unix/Linux下默认为/usr/local, windows下默认为C:\Program Files; 10.??CMAKE_MODULE_PATH:设置搜索CMakeModules模块(.cmake)的额外路径,用来定义自己的cmake模块所在的路径; 11.??CMAKE_CURRENT_SOURCE_DIR:指的是当前处理的CMakeLists.txt所在的路径; 12.??CMAKE_CURRENT_BINARY_DIR:如果是in-source编译,则跟CMAKE_CURRENT_SOURCE_DIR一致;如果是out-of-source,指的是target编译目录; 13.??CMAKE_CURRENT_LIST_FILE:输出调用这个变量的CMakeLists.txt的完整路径; 14.??CMAKE_CURRENT_LIST_LINE:输出这个变量所在的行; 15.??CMAKE_INCLUDE_CURRENT_DIR:自动添加CMAKE_CURRENT_BINARY_DIR和CMAKE_CURRENT_SOURCE_DIR到当前处理的CMakeLists.txt; 16.??CMAKE_INCLUDE_DIRECTORIES_PROJECT_EFORE:将工程提供的头文件目录始终至于系统头文件目录的前面,当你定义的头文件确定跟系统发生冲突时可以提供一些帮助; 17.??EXECUTABLE_OUTPUT_PATH:指定可执行文件的存放路径,最终结果的存放目录; 18.??LIBRARY_OUTPUT_PATH:指定库文件存放路径,最终结果的存放目录; 19.??BUILD_SHARED_LIBS:指定编译成静态库还是动态库; 20.??PROJECT_BINARY_DIR(CMAKE_BINARY_DIR):如果是内部构建(in-sourcebuild),指的就是工程顶层目录;如果是外部构建(out-of-source build),指的是工程编译发生的目录; 21.??PROJECT_NAME:工程名称,即使用PROJECT命令设置的名称; 22.??PROJECT_SOURCE_DIR(CMAKE_SOURCE_DIR):工程源代码文件所在的目录,指的是工程顶层目录; 23.??CYGWIN:标识当前系统是否为Cygwin; 24.??MSVC:标识当前系统是否使用MicrosoftVisual C; 25.??UNIX:标识当前系统是否为Unix系列(包括Linux、Cygwin和Apple); 26.??WIN32:标识当前系统是否为Windows及Win64; ? 内置变量的使用: 1.??????在CMakeLists.txt中指定,使用set; 2.??????cmake命令中使用,如cmake-DBUILD_SHARED_LIBS=OFF; CMake调用环境变量的方式:使用$ENV{NAME}指令就可以调用系统的环境变量了。如MESSAGE(STATUS “HOME dir:?$ENV {HOME}”) ???????? 设置环境变量的方式是:SET(ENV{变量名} 值) 变量,以${MY_VAIRABLE}的形式表达,其储存类型为字符串类型,但是可以根据具体命令的要求自动转换成布尔型、整型或者浮点类型。变量可以出现在字符串中,也可以实现”内省”。变量有用户自定义和系统内置两种,用户自定义变量使用SET命令设置;而系统变量由系统自动赋值,例如${PROJECT_SOURCE_DIR}。 CMake中的条件语句:IF(expression)… ELSE(expression) … ENDIF(expression) 或者IF(expression1) …ELSEIF(expression2) … ELSE() … ENDIF() ,expression是判断条件,和C/C++类似,CMake的条件也存在”与/或/非”以及”等于/大于/小于”等几种操作符,分别用AND/OR/NOT以及EQUAL/LESS/GREATER来表示。IF控制语句,变量是直接使用变量名引用,而不需要${}. ???????? CMake中的循环语句:FOREACH(vararg1 arg2 …) … ENDFOREACH(var) ,设置一个循环的局部变量var,每次将其赋为arg1, arg2等变量(或者变量数组)中的一个值,并执行循环中的命令段。 ???????? CMake中的宏函数可以理解为C语言的函数,它改变代码执行跳转的流程并简化了脚本程序的开发:MACRO(funcname [arg1 [arg2 …]]) … ENDMACRO(funcname) ,和函数的编写要求一样,CMake的宏函数必须制定一个函数名funcname,以及零个或多个输入参数arg1,arg2等。需要调用宏函数的时候,只要直接使用funcname(arg1 arg2)的形式就可以了。 ???????? CMake第一次运行的时候,它将产生一个文件叫CMakeCache.txt,该文件可以被看作一个配置文件,它里面的内容就像传递给configure命令的参数集。 例子1: // main.c # 定义cmake版本需求 # 定义工程名 #开始编译 #定义SRC_LIST指代main.c message(${SRC_LIST}) 在文件夹下建立一个build子文件夹,打开终端输入:cmake .. 然后,输入:make -j5 Scanning dependencies of target hello 执行 ./hello 输出hello world |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 3:05:41- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |