当前位置:网站首页 > 云服务教程 > 正文

cmake编写教程(cmake使用教程)



目录

【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 编译制定python版本 cmake编译教程_java

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

cmake 编译制定python版本 cmake编译教程_cmake 编译制定python版本_02

cmake 编译制定python版本 cmake编译教程_服务器_03

注意参数这一块,可以用引号包裹起来,这代表一个参数,假如一行不能写完,则用\符号来表示连接成一行,也可以不用引号,但是假如参数带有分隔符,则会被认为是多个参数。

定义变量常用的函数是set(KEY VALUE),取消定义变量是unset(KEY)。它们的值始终是string类型的,有些命令可能将字符串解释为其他类型的值。变量名是区分大小写的,可能包含任何文本,但是我们建议只使用字母数字字符加上_和-这样的名称。
变量引用的形式为${variable_name},并在引用的参数或未引用的参数中进行判断。变量引用被变量的值替换,或者如果变量没有设置,则由空字符串替换。变量引用可以嵌套,并从内部进行替换,例如${outer_${inner_variable}veriable}。
环境变量引用的形式为$ENV{VAR},并在相同的上下文中作为正常变量引用。




在构建c程序的时候,因为要生成可执行文件,是必须的;构建安卓动态库的时候,是必须的,因为jni需要调用动态库。

此时可以看到生成的文件全部在build文件夹下了,构建完全没问题。以后的项目讲解中将全部使用外部构建。

①message用法

message类似于一个向控制台输出日志的工具,但是功能又稍微强大一些,在一些模式下能够终止程序构建。

cmake 编译制定python版本 cmake编译教程_CMake_04

②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使用教程)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • msp430单片机教程(msp430单片机原理图)2025-12-09 10:00:11
  • dos安装软件命令(dos安装教程)2025-12-09 10:00:11
  • 二级域名解析教程(二级域名解析是什么意思)2025-12-09 10:00:11
  • awvs怎么使用(awvs12使用教程)2025-12-09 10:00:11
  • ubuntu镜像文件img(ubuntu镜像文件下载教程)2025-12-09 10:00:11
  • git clone教程(git clone命令怎么用)2025-12-09 10:00:11
  • autokey生长动画怎么渲染(autokey生长动画教程)2025-12-09 10:00:11
  • 泰拉瑞亚调时间教程(泰拉瑞亚如何设置时间)2025-12-09 10:00:11
  • autokey教程(autokit怎么用)2025-12-09 10:00:11
  • m301h cw刷机包(m301h cw刷机教程)2025-12-09 10:00:11
  • 全屏图片