具有独立子项目的CMake项目

san*_*thy 2 c++ cmake setup-project clion

我正在尝试创建一个具有以下目录结构的 cmake 项目:

root_folder
 lib
   common_library_for_all_submodules
 submodule_1
   src
    main.cpp
   tests
    main_test.cpp
 submodule_2
   src
    main.cpp
   tests
    main_test.cpp
 
Run Code Online (Sandbox Code Playgroud)

作为 C++ 和 CMake 的新手,我有以下困惑,如果有人能在这里指导我正确的方向,我将非常高兴。

  1. 来自 Java 世界,我知道可以使用 pom.xml 中的模块标签在 Maven 项目中创建。CMake 中有类似的东西吗?如果是,我们该怎么称呼它,有人可以给我一个例子吗?

  2. 然后我想将此项目导入到 CLion 中,当我运行根项目时,应编译所有子模块并运行相关测试。

注意:submodule_1 和 submodule_2 没有使用彼此的代码。他们是完全独立的。但他们需要共享 root_folder/lib 中的一些公共库

预先非常感谢

Iho*_*huk 8

您可以使用多个CMakeLists.txt文件,使用add_subdirectory语句。要声明库(将在另一个子项目中使用),请使用add_library. 声明应用程序 - add_executable. 将库链接到应用程序 - target_link_libraries(app1 PRIVATE utils common). 这是简短且非常常见的描述示例。还有更多选项和参数。

我在这里附上例子:

CMakeLists.txt

project(Example)

add_subdirectory(3rd-party)
add_subdirectory(apps)
add_subdirectory(libs)
Run Code Online (Sandbox Code Playgroud)

库/CMakeLists.txt

add_subdirectory(common)
add_subdirectory(utils)
Run Code Online (Sandbox Code Playgroud)

库/utils/CMakeLists.txt

FILE(GLOB SOURCES *.cpp *.h)

add_library(utils STATIC ${SOURCES})

target_include_directories(utils PUBLIC .)
Run Code Online (Sandbox Code Playgroud)

应用程序/CMakeLists.txt

add_subdirectory(app1)
add_subdirectory(app2)
Run Code Online (Sandbox Code Playgroud)

应用程序/app1/CMakeLists.txt

FILE(GLOB_RECURSE SOURCES src/*.cpp src/*.h)

add_executable(app1 ${SOURCES})
target_link_libraries(app1 PRIVATE utils common)
Run Code Online (Sandbox Code Playgroud)

在此示例中,库utilscommon是独立的,可以在没有彼此且没有应用程序的情况下构建