CMakeLists.txt
让所有 .cpp
文件(在 CLion 中)都能直接运行的编写方法¶
约 1167 个字 • 41 行代码
在cv noj答案时,发现答案作者的答案仓库中看到了 CMakeLists.txt
,感觉是一个项目,于是 clone
下来用 CLion 打开,发现每个 cpp
文件好像都显示可以直接运行
于是拿这个代码向 chatgpt 询问了一下
chatlog
You:
cmake_minimum_required(VERSION 3.20)
get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME)
string(REPLACE " " "_" ProjectId ${ProjectId})
project(${ProjectId} CXX)
set(CMAKE_CXX_STANDARD 14)
file(GLOB_RECURSE files "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
foreach(file ${files})
get_filename_component(name ${file} NAME)
add_executable(${name} ${file})
endforeach()
help me explain this
ChatGPT:
Certainly! The provided code is a CMakeLists.txt file, which is used to configure and build C++ projects with CMake, a cross-platform build system. Let's break down the code section by section:
-
cmake_minimum_required(VERSION 3.20)
:- Specifies the minimum version of CMake required to build the project. In this case, it requires version 3.20.
-
get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME)
:- Retrieves the name of the current source directory and stores it in the variable
ProjectId
. - The
NAME
argument toget_filename_component
means only the last component of the path (i.e., the directory name) is extracted.
- Retrieves the name of the current source directory and stores it in the variable
-
string(REPLACE " " "_" ProjectId ${ProjectId})
:- Replaces any spaces in the
ProjectId
variable with underscores. This is done to create a valid CMake project name, as spaces are not allowed in project names.
- Replaces any spaces in the
-
project(${ProjectId} CXX)
:- Declares a C++ project with the name stored in the
ProjectId
variable.
- Declares a C++ project with the name stored in the
-
set(CMAKE_CXX_STANDARD 14)
:- Sets the C++ standard to version 14.
-
file(GLOB_RECURSE files "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
:- Uses the
file
command to generate a list of source files in the current source directory and its subdirectories. - The
GLOB_RECURSE
option includes files recursively. - The resulting list of files is stored in the
files
variable.
- Uses the
-
foreach(file ${files})
:- Iterates over each file in the
files
list.
- Iterates over each file in the
-
get_filename_component(name ${file} NAME)
:- Retrieves the name of the current file and stores it in the variable
name
.
- Retrieves the name of the current file and stores it in the variable
-
add_executable(${name} ${file})
:- Creates an executable with the name stored in the
name
variable, using the corresponding source file stored in thefile
variable.
- Creates an executable with the name stored in the
In summary, this CMakeLists.txt file sets up a C++ project, replaces spaces in the project name, sets the C++ standard, and creates an executable for each .cpp file in the project directory and its subdirectories. The project name is derived from the name of the directory containing the CMakeLists.txt file.
You:
translate to chinese
ChatGPT:
当然!提供的代码是一个CMakeLists.txt文件,用于使用CMake配置和构建C++项目,CMake是一个跨平台的构建系统。让我们逐个部分解释代码:
-
cmake_minimum_required(VERSION 3.20)
:- 指定构建项目所需的最低CMake版本。在本例中,需要版本3.20。
-
get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME)
:- 获取当前源代码目录的名称,并将其存储在变量
ProjectId
中。 get_filename_component
中的NAME
参数意味着仅提取路径的最后一个组件(即目录名)。
- 获取当前源代码目录的名称,并将其存储在变量
-
string(REPLACE " " "_" ProjectId ${ProjectId})
:- 将
ProjectId
变量中的任何空格替换为下划线。这是为了创建一个有效的CMake项目名称,因为在项目名称中不允许有空格。
- 将
-
project(${ProjectId} CXX)
:- 使用存储在
ProjectId
变量中的名称声明一个C++项目。
- 使用存储在
-
set(CMAKE_CXX_STANDARD 14)
:- 将C++标准设置为14版本。
-
file(GLOB_RECURSE files "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
:- 使用
file
命令生成当前源代码目录及其子目录中的源文件列表。 GLOB_RECURSE
选项递归地包含文件。- 将结果文件列表存储在
files
变量中。
- 使用
-
foreach(file ${files})
:- 遍历
files
列表中的每个文件。
- 遍历
-
get_filename_component(name ${file} NAME)
:- 获取当前文件的名称,并将其存储在变量
name
中。
- 获取当前文件的名称,并将其存储在变量
-
add_executable(${name} ${file})
:- 使用存储在
name
变量中的名称,创建一个可执行文件,使用相应的存储在file
变量中的源文件。
- 使用存储在
总的来说,这个CMakeLists.txt文件设置了一个C++项目,替换了项目名称中的空格,设置了C++标准,并为项目目录及其子目录中的每个.cpp文件创建一个可执行文件。项目名称来源于包含CMakeLists.txt文件的目录的名称。
然后我想看看还有没有更简单的,但是能实现同样效果的写法,于是又去问了一下星火,
chatlog
You:
我想构建一个包含多个源文件的C++项目,每个源文件都会生成一个可执行文件,我应该如何去编写 cmakelists.txt?
Spark:
在CMakeLists.txt文件中,你可以使用add_executable
命令来为每个源文件创建一个可执行文件。假设你的项目结构如下:
你可以在CMakeLists.txt中这样写:
cmake_minimum_required(VERSION 3.0)
project(my_project)
# 添加源文件
file(GLOB_RECURSE SOURCES "src/*.cpp")
# 为每个源文件创建一个可执行文件
foreach(SOURCE ${SOURCES})
get_filename_component(FILENAME ${SOURCE} NAME)
add_executable(${FILENAME} ${SOURCE})
endforeach()
这段代码首先定义了项目的最小版本要求,然后创建了一个名为my_project
的项目。接着,它使用file(GLOB_RECURSE)
命令查找所有的.cpp
源文件,并将它们存储在SOURCES
变量中。最后,对于SOURCES
中的每个源文件,它使用get_filename_component
函数获取不带路径的文件名,并使用add_executable
命令为该源文件创建一个可执行文件。
然后它给了我一份代码,我简单地进行了尝试,发现也能实现效果,
于是我稍加修改(加了一些之前我常用的设置)
cmake_minimum_required(VERSION 3.25)
project(my_project)
set(CMAKE_C_STANDARD 11)
# 添加源文件
file(GLOB_RECURSE SOURCES "*.cpp")
# 为每个源文件创建一个可执行文件
foreach(SOURCE ${SOURCES})
get_filename_component(FILENAME ${SOURCE} NAME)
add_executable(${FILENAME} ${SOURCE})
endforeach()
其中 my_project
我习惯改成文件夹名
创建日期: 2024-01-05