cmake使用方法(详细)

cmake使用方法(详细),第1张

例子

在 cmake 脚本中,设置编译选项可以通过 add_compile_options 命令,也可以通过 set 命令修改 CMAKE_CXX_FLAGS 或 CMAKE_C_FLAGS 。

使用这两种方式在有的情况下效果是一样的,但请注意它们还是有区别的:

例子

也可以直接在编译的时候指定:

语法

待补充

语法

在CMake中基础的数据形式是字符串。CMake也支持字符串列表。

列表通过分号分隔。譬如两个声明给变量VAR设同样的值:

字符串列表可以通过foreach命令迭代或直接 *** 控列表命令。

CMake 支持简单的变量可以是字符串也可以是字符串列表。变量参考使用 ${VAR} 语法。多参数可以使用 set 命令组合到一个列表中。所有其他的命令

通过空白分隔符传递命令来扩展列表,例如

像大多数语言一样,Cmake 提供了控制流结构。Cmake提供了三中控制流:

更多控制流信息参见命令 if,while,foreach,macro,function文档。

在CMake中原义字符串用双引号括起来。字符串可以是多行字符串,并在其中嵌入新的行。例如

也可以在一个字符串中转义字符和使用变量

同样支持标准C中的转义

如果字符在引号之前是空格则原义字符串只是原义字符串。但是引号必须成对,例如

cmake可以使用正则表达式

cmake project 头文件必须存在这行命令, 例如 cmake_minimum_required(VERSION 3.10)

设置项目名称 project(Tutorial)

语法

例子

语法

将指定的源文件(CPP文件)生成链接文件,然后添加到工程中去。

语法

其中 <name>表示库文件的名字,该库文件会根据命令里列出的源文件来创建。而 STATIC 、 SHARED 和 MODULE 的作用是指定生成的库文件的类型。

例子

在子文件夹添加了 library 或者 executable 之后,在上层目录添加 subdirectory , 也可以在同一个CMakeList.txt中使用

它相当于 g++ 选项中的 -I 参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用。

语法:

它相当于 g++ 命令的 -L 选项的作用,也相当于环境变量中增加 LD_LIBRARY_PATH 的路径的作用。

语法:

语法:

该指令的作用主要是指定要链接的库文件的路径,该指令有时候不一定需要。因为find_package和find_library指令可以得到库文件的绝对路径。不过你自己写的动态库文件放在自己新建的目录下时,可以用该指令指定该目录的路径以便工程能够找到。

语法:

link_libraries(library1 <debug | optimized>library2 ...)

可以链接一个,也可以多个,中间使用空格分隔.

语法:

语法:

简单的例子如下:

一般情况下, make install 在不指定 prefix 默认安装在`/usr/local/bin

如果你在Gitee上下载的代码缺少CMake文件,那么可能需要手动添加CMake文件。

以下是添加CMake文件的步骤:

在项目的根目录下创建一个名为CMakeLists.txt的文件。

打开CMakeLists.txt文件,在文件中添加CMake指令来配置项目。

配置完成后,使用CMake来构建项目。

以下是一个简单的CMakeLists.txt文件示例:

plaintext

Copy code

cmake_minimum_required(VERSION 3.5)

project(my_project)

# 添加源文件

add_executable(my_project main.cpp)

# 链接库

target_link_libraries(my_project my_library)

这个示例文件中,我们使用了CMake的add_executable指令来添加源文件,并使用target_link_libraries指令来链接库。

请根据你的项目需要,自行修改CMakeLists.txt文件。

1.外部编译的一个实例:

对于 cmake,内部编译在CMake(一)已经演示过了,它生成了一些无法自动删除的中间文件,所以, 引出了我们对外部编译的探讨,外部编译的过程如下:

1,首先,请清除t1目录中除main.c CmakeLists.txt之外的所有中间文件,最关键 的是 CMakeCache.txt。

2,在t1目录中建立build 目录,当然你也可以在任何地方建立build目录,不一定必 须在工程目录中。

3,进入build目录,运行cmake ..(注意,..代表父目录,因为父目录存在我们需要的 CMakeLists.txt,如果你在其他地方建立了build目录,需要运行cmake <工程的全 路径>),查看一下 build 目录,就会发现了生成了编译需要的 Makefile 以及其他的中间 文件.

4,运行 make 构建工程,就会在当前目录(build 目录)中获得目标文件 hello。

上述过程就是所谓的 out-of-source 外部编译,一个最大的好处是,对于原有的工程没 有任何影响,所有动作全部发生在编译目录。通过这一点,也足以说服我们全部采用外部编 译方式构建工程。

贴图(tree图如下)

目录结构是: CMakeLIsts.txt 放在工程的顶层目录下,而建立build, 然后cmake 生成的中间文件会自动放到build 目录下,Cmake的中间文件不能通过make clean 自动删除,这种方式手动删除的时候比较便利。

2.建立src 目录,把所有的source 文件都挪到src 下面去, bin 里面的文件则是自动生成的。

CMakeLists.txt 文件如下:

编译:

这里要注意的是ADD_SUBDIRECTORY,如果把source 移入到Src,然后编译的时候会出错,说无法再src下面找到CMakeLIsts.txt文件,这里的处理是用SET()方法指定了source 的路径才过的,而ADD_SUBDIRECTORY暂时没有用。

**1)以下是一些说明,还需要慢慢体会用法的精妙之处。

ADD_SUBDIRECTORY 指令ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

这个指令用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存 放的位置。EXCLUDE_FROM_ALL 参数的含义是将这个目录从编译过程中排除,比如,工程 的 example,可能就需要工程构建完成后,再进入 example 目录单独进行构建(当然,你 也可以通过定义依赖来解决此类问题)。

**2) 关于要从src 中找CMakeLists.txt 我一直觉得比较反人类,看了一些成熟项目的make 结构,src 下面也没有放这个文件。但为什么参考资料里面没有提要做SET的设定,或许是cmake 的版本不同?

加了最后两行

形成的工程文件如下,静态库.a在lib中生成。

同理可以生成动态库,省略,

source code:

https://github.com/xieheng0915/eosapps/tree/master/t2

追记:

cmake 的整合,以及其他功能还是在以后使用中再看,以下是一些参考的link:

https://stackoverflow.com/questions/41319476/cmake-add-subdirectory-not-invoking-the-child-cmakelists-txt

http://derekmolloy.ie/hello-world-introductions-to-cmake/


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/8024531.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存