一.背景及须知
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)