关于这个东西,之前学过很多次(为啥用次呢,因为每次没找到合适的学习材料,最终导致恼火焦躁,容易陷入误区),现在做个记录
首先,在我第一次接触CMake ,就感觉这个东西编译项目挺方便。但是,当打开文件后,真真的看不懂。所以去找官方材料(听信谗言,毕竟当时很久没学英语,水平有限,也不要用转换成中文的去看,没用的)
1、编译同级目录的源文件
就是 CMakelists.txt 文件和源文件等在同一个文件夹中的时候,就这么几行,我们就可以编译了。会生成func 和stack 的两个可执行文件
这些命令的作用啥的网上很讲解的,就不多写了
cmake_minimum_required(VERSION 3.10) # set(CMAKE_CXX_STANDARD 11) # project(Leetcode) # add_executable(func func.c) add_executable(stack stack.c)
2、编译多级和多文件夹时
创建最顶级的CMakeLists.txt 文件(这里也有些问题,就是我们使用Cmake,就一定涉及到了多文件,多文件夹的问题,比如include,source文件,bin文件等等。这里先以source和bin来说 )
cmake_minimum_required(VERSION 3.10) # set(CMAKE_CXX_STANDARD 11) # project(Leetcode) # message(STATUS "THIS IS BINARY directory" ${Leetcode_BINARY_DIR}) message(STATUS "THIS IS SOURCE directory" ${Leetcode_SOURCE_DIR}) add_subdirectory(source bin)# source 是源文件的子目录,bin是存放二进制文件的 //源文件的路径,就是source ,从中获取源文件; bin路径表示会将编译过程产生的二进制文件存到这里
一、最顶级的目录中需要设定好一些先决条件
为啥要这么做呢,
cmake管理项目,我自己用起来感觉它的特征,就是使用一个最顶级的CMakeLists.txt 去管理其他分目录的CMakelists.txt (这就会出现另外一个问题,编译的时候,不可能每个文件夹里都去设定一次版本号,工程名什么的)
所以使用add_subdiretory可以建立和其他文件中CmakeLists.txt 的联系,让它可以找到其他文件夹中的CMakeList.txt。
(这里也包括其他的,比如添加其他的头文件目录的时候include_directories(),这些命令不可能在源文件所在的CMakeLists.txt中写进去,不然就太麻烦了)
下面是截图示例
比如图中和bin等文件夹同级的CMakelists.txt 文件
下面用#号表示哪一行是必须的内容
1、需要先定义cmake的版本:
第一个#号 示例 使用 最好以后都加上VERSION这个关键词。(网上各种版本都有,之前看着每个版本写不写version的都不一样,最好都写上)
2、需要设置编译器的版本,
这个还是要有的,下图是以C++11为例,第二个#号行。
3、设定项目工程的 名字
找了很多材料,没有发现这东西的内部实现到底是什么方式。而且,也不会在项目中生成对应名字的文件夹。但是有一些CMake用到的语法变量需要使用工程名字,保证是本工程的信息。类似message那两行。
实际上cmake 系统本身预定义了 PROJECT_BINARY_DIR 和PROJECT_SOURCE_DIR 变量,(PROJECT可以替换,自己测试时改成了Leetcode,也可以直接用预定义的,这样就不用在修改工程名的时候修改这些琐碎的内容)
4、至于第四个#号,使用的是add_subdirectory() 上面有写是做什么的。这个函数还有别的参数,但是目前用不到,暂时先一步步来写
总体感觉这个最顶级的有点像是一个宏观的处理管理方案,其他的细节分支部分怎么处理,需要对应的方案,比如下面的source中文件的设置
6、下图就是source中的文件
因为需要生成不同的可执行文件 直接使用这个命令,添加后,就会直接生成到bin文件中了,生成哪个写哪个就行。
很多东西都需要用语法和变量什么的去简化让它更通用,以达到高效修改和添加、检查的目的,只是一些基础的内容。目前刚学了python基础,准备用python的方法去获取股票信息试试。比较有意思