跳转至

CMakeLists.txt 让所有 .cpp 文件(在 CLion 中)都能直接运行的编写方法

约 1167 个字 • 41 行代码

在cv noj答案时,发现答案作者的答案仓库中看到了 CMakeLists.txt ,感觉是一个项目,于是 clone 下来用 CLion 打开,发现每个 cpp 文件好像都显示可以直接运行

cmakelists_skill

于是拿这个代码向 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:

  1. 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.
  2. 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 to get_filename_component means only the last component of the path (i.e., the directory name) is extracted.
  3. 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.
  4. project(${ProjectId} CXX):

    • Declares a C++ project with the name stored in the ProjectId variable.
  5. set(CMAKE_CXX_STANDARD 14):

    • Sets the C++ standard to version 14.
  6. 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.
  7. foreach(file ${files}):

    • Iterates over each file in the files list.
  8. get_filename_component(name ${file} NAME):

    • Retrieves the name of the current file and stores it in the variable name.
  9. add_executable(${name} ${file}):

    • Creates an executable with the name stored in the name variable, using the corresponding source file stored in the file variable.

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是一个跨平台的构建系统。让我们逐个部分解释代码:

  1. cmake_minimum_required(VERSION 3.20)

    • 指定构建项目所需的最低CMake版本。在本例中,需要版本3.20。
  2. get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME)

    • 获取当前源代码目录的名称,并将其存储在变量ProjectId中。
    • get_filename_component中的NAME参数意味着仅提取路径的最后一个组件(即目录名)。
  3. string(REPLACE " " "_" ProjectId ${ProjectId})

    • ProjectId变量中的任何空格替换为下划线。这是为了创建一个有效的CMake项目名称,因为在项目名称中不允许有空格。
  4. project(${ProjectId} CXX)

    • 使用存储在ProjectId变量中的名称声明一个C++项目。
  5. set(CMAKE_CXX_STANDARD 14)

    • 将C++标准设置为14版本。
  6. file(GLOB_RECURSE files "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")

    • 使用file命令生成当前源代码目录及其子目录中的源文件列表。
    • GLOB_RECURSE选项递归地包含文件。
    • 将结果文件列表存储在files变量中。
  7. foreach(file ${files})

    • 遍历files列表中的每个文件。
  8. get_filename_component(name ${file} NAME)

    • 获取当前文件的名称,并将其存储在变量name中。
  9. add_executable(${name} ${file})

    • 使用存储在name变量中的名称,创建一个可执行文件,使用相应的存储在file变量中的源文件。

总的来说,这个CMakeLists.txt文件设置了一个C++项目,替换了项目名称中的空格,设置了C++标准,并为项目目录及其子目录中的每个.cpp文件创建一个可执行文件。项目名称来源于包含CMakeLists.txt文件的目录的名称。

然后我想看看还有没有更简单的,但是能实现同样效果的写法,于是又去问了一下星火,

chatlog

You:

 

我想构建一个包含多个源文件的C++项目,每个源文件都会生成一个可执行文件,我应该如何去编写 cmakelists.txt?

 

Spark:

 

在CMakeLists.txt文件中,你可以使用add_executable命令来为每个源文件创建一个可执行文件。假设你的项目结构如下:

my_project/
├── CMakeLists.txt
├── src1.cpp
└── src2.cpp

你可以在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-06
创建日期: 2024-01-05

评论