如何使用 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++ 而言,这确实被认为是一个库。
我正在尝试构建一个 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++ 而言,这确实被认为是一个库。