目录
【cmake 安装】
1、使用yum安装
2、使用源码安装(当你想要获取更高版本的cmake)//源码安装三部曲 https://blog.51cto.com/u_14273/configure ~ make ~ make install
3、编写程序验证
【cmake 语法基础】
(1)cmake基本编写格式:
(2)定义变量
(3)cmake构建系统
(4)外部构建 ※※
①message用法
②cmake_minimum_required (VERSION 2.6):
③ project (Tutorial)
④configure_file
⑤include_directories这一行:include_directories("${PROJECT_BINARY_DIR}")
(5)CMake 链接第三方的库 ※(指定支持C++11)
举例 (1)链接libev, 如下:
举例(2)导入第三方库wfdb库:
(6)cmake:用add_subdirectory()添加外部项目文件夹
(7)include_directories,link_directories,link_libraries 和 target_link_libraries 小结 ※☆
① INCLUDE_DIRECTORIES(添加头文件目录)
②LINK_DIRECTORIES(添加需要链接的库文件目录,尽量全路径)
③LINK_LIBRARIES(添加需要链接的库文件路径,注意这里是全路径!!※)
④TARGET_LINK_LIBRARIES (设置要链接的库文件的名称)
⑤联合示例:
【CMakeList.txt的简单实战】
<1>CMake 简介
<工程练习 - 1>
<工程练习 - 2>
<工程练习 - 3>
$yum erase cmake//卸载原先cmake
$wget https://cmake.org/files/v3.9/cmake-3.9.0.tar.gz//下载
$tar xvf cmake-3.9.0.tar.gz //解压
$cd cmake-3.9.0
$https://blog.51cto.com/u_14273/configure
$make
$make install //在/usr/local/bin可以看到cmake可执行程序,添加cmake到PATH环境变量中
$cmake --version //查看版本为3.9.0
新建一个CMakeLists.txt文件(文件名不能改成其他),内容如下:
本节讲的命令格式遵循如下语法:(应该是比较通用的规则)

cmake能识别CMakeLists.txt和*.cmake格式的文件。cmake能够以三种方式 来组织文件,本系列主要以CMakeLists.txt的语法为主要讲解内容。


注意参数这一块,可以用引号包裹起来,这代表一个参数,假如一行不能写完,则用\符号来表示连接成一行,也可以不用引号,但是假如参数带有分隔符,则会被认为是多个参数。
定义变量常用的函数是set(KEY VALUE),取消定义变量是unset(KEY)。它们的值始终是string类型的,有些命令可能将字符串解释为其他类型的值。变量名是区分大小写的,可能包含任何文本,但是我们建议只使用字母数字字符加上_和-这样的名称。
变量引用的形式为${variable_name},并在引用的参数或未引用的参数中进行判断。变量引用被变量的值替换,或者如果变量没有设置,则由空字符串替换。变量引用可以嵌套,并从内部进行替换,例如${outer_${inner_variable}veriable}。
环境变量引用的形式为$ENV{VAR},并在相同的上下文中作为正常变量引用。
在构建c程序的时候,因为要生成可执行文件,是必须的;构建安卓动态库的时候,是必须的,因为jni需要调用动态库。
此时可以看到生成的文件全部在build文件夹下了,构建完全没问题。以后的项目讲解中将全部使用外部构建。
①message用法
message类似于一个向控制台输出日志的工具,但是功能又稍微强大一些,在一些模式下能够终止程序构建。

②cmake_minimum_required (VERSION 2.6):
为一个项目设置cmake的最低要求版本,并更新策略设置以匹配给定的版本。无论是构建项目还是构建库,都需要这个命令。 它的语法是这样的:
版本号必须指定主次代号,后边的可选,请忽略可选项,完全没用。
假如你指定的版本号大于你安装的cmake版本,将会停止构建并抛出一个错误:
必须在项目根目录下的最开始调用,也就是之前。在function()中调用该指令也可以,作用域将局限在函数内,但是必须以不影响全局使用为前提。
③ project (Tutorial)
指定项目的名称为,构建项目必须使用这个命令,构建库可以不指定。文档如下:
设置项目名称并将该名称存储在变量中。同时也指定了四个变量:
但是我们一般只使用前一个,这样更容易更改。在上边的代码中我们用message输出了这些变量的信息,执行构建命令后日志输出:
我们也可以在指定项目名称时直接指定版本号,假如没有指定,则版本号为空。 版本号存储在下边几个变量中:
通常我们推荐使用前一个。现在测试一下,在CMakeLists.txt文件中修改代码:
description被存储到PROJECT_DESCRIPTION这个变量中了。
可以通过设置LANGUAGES来指定编程语言是C、CXX(即c++)或者Fortran等,如果没有设置此项,默认启用C和CXX。设置为NONE,或者只写LANGUAGES关键字而不写具体源语言,可以跳过启用任何语言。一般都是用cmake来编译c或者c++程序,所以用默认的就可以了。
④
将input文件复制到output文件中,并在输入文件内容中替换@VAR@或${VAR}的变量值。每个变量引用将被替换为变量的当前值,如果变量的值未被定义,则为空字符串。(VAR必须与cmakelist.txt中的变量保持一直,否则会生成注释)。
input文件的定义形式为:
经过configure后生成的文件内容被替换为:
生成的文件将会保留在'#'与'cmakedefine'之间的空格和制表符。
lion有一个问题,就是直接用cmakedefine定义宏的时候假如#与cmakedefine之间有空格则不会替换cmakedefine为define,后边的变量会替换,但是不能编译成功,所以假如在clion中使用,要注意这几点,直接使用#define或者#cmakedefine,尽量不要加空格。
举例: foo.h.in文件如下
CMakeLists.txt中添加代码来设置一个开关,下边会执行if中的语句:
生成的文件foo.h:
假如设置为off,option(FOO_ENABLE "Enable Foo" OFF),则不会执行if中的语句,生成的文件如下:
⑤include_directories这一行:include_directories("${PROJECT_BINARY_DIR}")
这句话的意思将当前的二进制目录添加到编译器搜索include目录中,这样就可以直接使用上一步生成的头文件了。
默认情况下,指定的目录被追加到当前的include目录列表中。通过将CMAKE_INCLUDE_DIRECTORIES_BEFORE设置为ON,可以更改此默认行为。通过明确使用AFTER或BEFORE,您可以选择添加和预先设置。如果给出SYSTEM选项,那么编译器会被告知这些目录在某些平台上是指系统包含的目录。
举例 (1)链接libev, 如下:
举例(2)导入第三方库wfdb库:
然后依次设置头文件目录、库目录、要链接的库,如下:
注意以上代码须放在add_executable语句之前,而接下来的链接库操作则须放在add_executable语句之后。
使用如下语句完成库的链接操作:
括号中的wfdb_demo为工程名称,wfdb为库的名称。至此我们就完成第三方库的链接过程。
一般情况下,我们的项目各个子项目都在一个总的项目根目录下,但有的时候,我们需要使用外部的文件夹,怎么办呢? 命令,可以将指定的文件夹加到build任务列表中。下面是将与当前项目平级的一个目录下的子目录用命令加进来的CMakelists.txt脚本片段 :
然后执行CMakeList.txt脚本时报错了:
报错原因也很明确,因为要添加的这个文件夹不是当前项目的子目录。最后一句指明了方向:要指定一个外部的文件夹必须显式指定a binary directory。
原来add_subdirectory还有一个 binary_dir参数(一般这个参数用不到,所以从来没关注过),这个参数用来指定source_dir在输出文件夹中的位置,如果没有指定的时候,就用source_dir的值。 如果要添加外部文件夹,binary_dir就必须指定。所以上面的代码修改如下:
//参考链接cmake:用add_subdirectory()添加外部项目文件夹_weixin_的博客-CSDN博客
① INCLUDE_DIRECTORIES(添加头文件目录)
它相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用(这里特指c++。c和Java中用法类似)。比如:
②LINK_DIRECTORIES(添加需要链接的库文件目录,尽量全路径)
它相当于g++命令的-L选项的作用,也相当于环境变量中增加LD_LIBRARY_PATH的路径的作用。比如:
③LINK_LIBRARIES(添加需要链接的库文件路径,注意这里是全路径!!※)
④TARGET_LINK_LIBRARIES (设置要链接的库文件的名称)
⑤联合示例:
以下CMakeLists.txt效果相当,在ubuntu 12.04 + g++4.6下测试编译通过:
CMake 是一个跨平台的自动化建构系统,它使用一个名为 CMakeLists.txt 的文件来描述构建过程,可以产生标准的构建文件,如 Unix 的 Makefile 或Windows Visual C++ 的 projects/workspaces 。文件 CMakeLists.txt 需要手工编写,也可以通过编写脚本进行半自动的生成。CMake 提供了比 autoconfig 更简洁的语法。在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:
1)编写 CmakeLists.txt。
2)执行命令“cmake PATH”或者“ccmake PATH”生成 Makefile ( PATH 是 CMakeLists.txt所在的目录 )。
3)使用 make 命令进行编译。
源代码分布情况:假设我们的项目中只有一个源文件 main.cpp
源文件main.cpp内容:
※ CMakeLists.txt 的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的,符号"#"后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。
第一行是一条命令,名称是 PROJECT ,参数是 Hello,该命令表示项目的名称是 Hello 。第二行的命令限定了 CMake 的版本。第三行使用命令 AUX_SOURCE_DIRECTORY 将当前目录中的源文件名称赋值给变量 DIR_SRCS 。 CMake 手册中对命令 AUX_SOURCE_DIRECTORY 的描述如下:aux_source_directory(<dir> <variable>)该命令会把参数 <dir>中所有的源文件名称赋值给参数<variable>。 第四行使用命令 ADD_EXECUTABLE 指示变量 DIR_SRCS 中的源文件需要编译 成一个名称为 main 的可执行文件。
make根据生成makefile文件,编译程序。
源代码分布情况:
主函数main.cpp:
test.cpp内容:
test.h中内容:
CMakeLists.txt内容:(与工程练习 - 1一致)
源代码分布情况:
——子文件(src)的CMakeLists.txt:
camke 的运行结果:(注:将test修改为mytest,可消除 Policy CMP0037 告警)
到此这篇cmake编写教程(cmake使用教程)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/do-yfwjc/25090.html