关于Cmake与CmakeLists(一)--背景,须知,示例

一.背景及须知

1.背景:    VS2019与VS2010在编写程序时都是创建了一个工程,然后直接打开.sln即可
                 但是vscode仅仅是一个编辑器,打开之后只有.c或者.cpp文件,故需要手动编译链接

2.名词解释:
Makefile与CMakeLists.txt:
Makefile文件描述了整个工程的编译、链接等规则。包括:工程中的哪些源文件需要编译以及如何编译、需要创建哪些库文件以及如何创建这些库文件、如何最后产生我们想要的可执行文件。
CMakeLists.txt:但由于Makefile文件的语法很繁琐,故采用CMAKE工具,通过编写CMakeLists.txt,使用CMAKE工具读取CMakeLists.txt来自动生成对应的Makefile文件


CMAKE与make工具
make工具是一个命令工具,是一个解释makefile中指令并运行相应指令的工具。
CMAKE工具是一个编译打包工具,通过读取CMakeLists.txt来生成Makefile或project文件
(Makefile文件在vscode中是红色的M图标,CMakeLists.txt是蓝色的M图标)

archive    静态库
library    动态库
runtime    可执行二进制文件


3.安装相应工具
apt install g++        vscode上安装扩展:CMake,CMake Tools
apt install cmake
apt install make


4.构建build目录
通常采用外部构建的方式执行cmake
即新建一个文件夹build,cd build ,cmake ..,将临时文件存放在指定的目录下,避免污染工程

5.CmakeLists命令通用注意事项:                                 
command(<target> [E] <A|B|C>)  
尖括号<>    表示必选项,必须填写的变量
方括号[ ]      表示可选项,选填的变量
竖线 |        表示或的意思,即内部填写A或者B或者C

cmake的内置命令是不区分大小写的    add_subdirectory与ADD_SUBDIRECTORY作用一致。
cmake的所有变量都是区分大小写的

二.基础示例

1.仅一个test.cpp文件
cmake_minimum_required(VERSION 3.9)     # 指定运行此配置文件所需的 CMake 的最低版本   
project(HelloWorld)                       # 指定项目的名称, 
set(CMAKE_CXX_STANDARD 11)              # 把编译选项设置为了C++ 11   
add_executable(HelloWorld test.cpp)     # 将名为 main.cpp 的源文件编译成名称为 HelloWorld 的可执行文件  

2.单层级目录结构
当目录结构为如下时
/test                    //工程名字  
——/src                   //一级目录
————test.cpp             //源文件
————CMakeLists.txt      //CMakeLists.txt
——CMakeLists.txt        //CMakeLists.txt

外层CmakeLists.txt
cmake_minimum_required(VERSION 3.9)         # 指定运行此配置文件所需的 CMake 的最低版本   
project(HelloWorld)                         # 指定项目的名称, 
set(CMAKE_CXX_STANDARD 11)                  # 把编译选项设置为了C++ 11   
# add_executable(HelloWorld test.cpp)       # 将名为 main.cpp 的源文件编译成名称为 HelloWorld 的可执行文件  
add_subdirectory(src)                       # 向子目录添加CMakeLists.txt,即构建时添加子目录的CMakeLists.txt
                                            # add_subdirectory(source_dir [binary_dir]) []代表可选项,src代表包含src的子目录中的CMakeLists.txt
                                            # binary_dir代表子目录生成的中间文件存放位置,不填写的话默认在build目录下创建一个src文件夹,在内部存储

内层CmakeLists.txt
cmake_minimum_required(VERSION 3.9)         # 指定运行此配置文件所需的 CMake 的最低版本   
set(CMAKE_CXX_STANDARD 11)   
aux_source_directory(. source_list)         #获取当前位置的全部源文件(.c与.cpp文件),并把名字存在source_list变量内
add_executable(HelloWorld ${source_list})   #使用全部的源文件构建一个名字叫HelloWorld的工程
# set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../bin/)   #将生成的可执行文件存放在上一级即build同级的bin文件夹下,一般不需要

3.多层级目录结构目录结构
/hello                    c_cpp_properties.json中的“includePath”:添加一下"${workspaceFolder}/test/inc"
——/test                理论上本来是不用的,有"${workspaceFolder}/**"递归查询全部子目录,不知道为什么编译能通过,文件能生成,但会标红报错
————/inc
——————test.h
————/src
——————test.cpp
————CMakeLists.txt
——/CMakeLists.txt

外部CMakeLists.txt没变
cmake_minimum_required(VERSION 3.9)         # 指定运行此配置文件所需的 CMake 的最低版本   
project(HelloWorld)                         # 指定项目的名称, 
set(CMAKE_CXX_STANDARD 11)                  # 把编译选项设置为了C++ 11   
# add_executable(HelloWorld test.cpp)       # 将名为 main.cpp 的源文件编译成名称为 HelloWorld 的可执行文件  
add_subdirectory(test)                       # 向子目录添加CMakeLists.txt,即构建时添加子目录的CMakeLists.txt
                                            
内部CMakeLists.txt增加一个include_directories

cmake_minimum_required(VERSION 3.9)         # 指定运行此配置文件所需的 CMake 的最低版本   
set(CMAKE_CXX_STANDARD 11)   
aux_source_directory(./src source_list)         #获取当前位置的全部源文件(.c与.cpp文件),并把名字存在source_list变量内

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc)    //两种方法,包含当前目录的子目录/inc内的头文件
# include_directories(${CMAKE_SOURCE_DIR}/test/inc)        //包含资源文件的子目录test的子目录inc内的头文件

add_executable(HelloWorld ${source_list})   #使用全部的源文件构建一个名字叫HelloWorld的工程

# set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../bin/)   #将生成的可执行文件存放在上一级即build同级的bin文件夹下,一般不需要

补充:建议使用target_include_directories,避免如果有不同目录相同名称的头文件会产生影响
include_directories(dir)
target_include_directories(<target>, <INTERFACE|PUBLIC|PRIVATE>,dir)
例子:target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../include)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值