如何使用 CMake 构建许多不同的包

How to build many different packages with CMake

我正在尝试构建一个 CMake 项目,我需要在其中构建不同的包。这是我想要的结构:

package1
  src
    file.cpp
  test
    file_test.cpp
package2
  src
    file2.cpp
  test
    file2_test.cpp
CMakeLists.txt
main.cpp // this will be removed later

这是我当前的 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.10)

# set the project name
project(cppApp)

# specify the C++ standard
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

include_directories(${PROJECT_SOURCE_DIR})

# add the executable
add_executable(cppApp main.cpp ./package1/src/file.cpp ./package2/src/file2.cpp)

所以问题首先是,一个库在CMake中被认为是一个包吗?这个问题来自做过很多 Java 的人,我通常将其称为包而不是库。但是它在 CMake 中吗?

此外,我如何在 CMake 中包含要构建的“包”中的所有文件,而不是将文件硬编码为可执行文件?如果我创建许多 .cpp/.h 文件,我想尽可能地自动化它。

我看到其他一些项目在每个“包”中使用一个 CMakeLists.txt 文件,这是理想的吗?这是好的做法吗?

如果你有更好的建议,根据我应该用来构建我的项目的一些标准,我也想知道一个好的建议。

So the question is firstly, is a library considered a package in CMake? This question comes from someone who have done a lot of Java where I would typically call that a package and not a library. But does it in CMake?

您在 Java 中对包的定义不太准确。包只是一种以命名空间方式在Java中组织类的手段。它可能是一个单独库的 类,但没有什么能阻止您在同一个项目中使用不同的包。它与 CMake packages 无关,其中每个包实际上是一个完整的独立项目。

I have seen that some other projects use a CMakeLists.txt file inside each "package", is this ideal? And is this good practice?

CMakeLists.txt 子目录中的文件只是为这些目录定义新的规则子集。为了使您的 CMake 项目遵守这些规则,您可以使用 add_subdirectory 添加此类目录。它不一定是一个单独的库,您可以为单个项目的部分创建规则的子集,如果某些文件确实如此不同,通常这样做是个好主意。

CMake have something called add_library(lib) and is those kinds of directories considered a library?

add_library 创建 so-called CMake 目标,就像 add_executable 一样。这些目标可以通过使用 target_link_libraries 相互链接,就 C++ 而言,这确实被认为是一个库。