目录
【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}")</p><p>(5)CMake 链接第三方的库 ※(指定支持C++11)</p><p>举例 (1)链接libev, 如下:</p><p>举例(2)导入第三方库wfdb库:</p><p>(6)cmake:用add_subdirectory()添加外部项目文件夹</p><p>(7)include_directories,link_directories,link_libraries 和 target_link_libraries 小结 ※☆</p><p> ① INCLUDE_DIRECTORIES(添加头文件目录)</p><p> ②LINK_DIRECTORIES(添加需要链接的库文件目录,尽量全路径)</p><p> ③LINK_LIBRARIES(添加需要链接的库文件路径,注意这里是全路径!!※)</p><p> ④TARGET_LINK_LIBRARIES (设置要链接的库文件的名称)</p><p> ⑤联合示例: </p><p> 【CMakeList.txt的简单实战】</p><p><1>CMake 简介</p><p><工程练习 - 1></p><p><工程练习 - 2></p><p><工程练习 - 3></p><hr style="background-color: rgb(232, 232, 232); border: 1px solid transparent; margin: 18px 0px;"><p>CentOS 7安装的命令为: sudo yum install cmake <br> 安装后查看版本为: cmake version 2.8.12.2</p><p><strong>\)yum erase cmake//卸载原先cmake
\(wget https://cmake.org/files/v3.9/cmake-3.9.0.tar.gz//下载<br> \)tar xvf cmake-3.9.0.tar.gz //解压
\(cd cmake-3.9.0<br><strong>\)https://blog.51cto.com/u_14273/configure
\(make</strong><br><strong>\)make install //在/usr/local/bin可以看到cmake可执行程序,添加cmake到PATH环境变量中
\(cmake --version //查看版本为3.9.0</p><p>\)mkdir Test //新建一个工程目录,并进入目录
新建一个文件为main.c ,内容如下:
新建一个CMakeLists.txt文件(文件名不能改成其他),内容如下:
在构建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}的变量值。每个变量引用将被替换为变量的当前值,如果变量的值未被定义,则为空字符串。</strong><strong>(VAR必须与cmakelist.txt中的变量保持一直,否则会生成注释)。</strong></p><p>input文件的定义形式为:</p><div></div><p>经过configure后生成的文件内容被替换为:</p><div></div><p> 生成的文件将会保留在'#'与'cmakedefine'之间的空格和制表符。</p><p>lion有一个问题,就是直接用cmakedefine定义宏的时候假如#与cmakedefine之间有空格则不会替换cmakedefine为define,后边的变量会替换,但是不能编译成功,所以假如在clion中使用,要注意这几点,直接使用#define或者#cmakedefine,尽量不要加空格。</p><p> 介绍其中的选项: input和output假如不指定绝对路径,则会被默认设置为CMAKE_CURRENT_SOURCE_DIR和CMAKE_CURRENT_BINARY_DIR,也就是项目根目录和构建的目录;<br> COPYONLY则只是复制文件,不替换任何东西,不能和NEWLINE_STYLE <style>一起使用。<br> ESCAPE_QUOTES禁止为"转义。这个很蛋疼,不加这个命令的话假如变量中有a"b,则在生成的文件中会直接使用转义后的字符a"b,加上指令后则按原来的文字显示a"b;<br> @ONLY只允许替换@VAR@包裹的变量\){VAR}则不会被替换;
NEWLINE_STYLE <style>设置换行符格式。
举例: 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 告警)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/144610.html