【问题标题】:Cmake project with multiple executables具有多个可执行文件的 Cmake 项目
【发布时间】:2023-04-01 13:38:01
【问题描述】:

我在使用具有多个可执行文件的 CMake 组织我的项目时遇到了问题。我有以下结构:

CmakeLists.txt
main.cpp
somelib.cpp
somelib.h
dir1
  main.cpp
  file1.h
  file1.cpp
  ...
dir2
  main.cpp
  lib1.h
  lib2.cpp
  ...

一般来说,我希望能够在 Clion 中选择可执行文件并独立运行任何项目,包括依赖于其他两个项目的外部项目。在外部main.cpp 中,我包含来自 dir1 和 dir2 的标题。 dir1、dir2 项目本身依赖于不同的库,如BoostEigenQt 等。使这种结构工作的最佳方法是什么?我是 Cmake 新手,多次尝试使用 add_subdirectory 并没有让我更接近解决方案。我使它仅在我有外部 CmakeLists.txt 并在使用 dir1、dir2 时包含所有库的情况下才起作用,就像文件夹中没有任何 CmakeLists.txt 一样。如有任何帮助,我将不胜感激。

【问题讨论】:

  • 我猜你的问题主要是如何用 CLion 做到这一点。在 Visual Studio 中,我使用类似于您描述的方法,但在 IDE 中,我选择要调试/运行的项目。它确实显示了同一工作区中的所有项目。但是,我确实为项目中的每个可执行文件和每个库都有一个 CMakeLists.txt,在根级别有一个 CMakeLists.txt。
  • 我最感兴趣的是如何编写相应的CmakeLists.txt,因为我在配置和构建过程中出现了错误。您能否概述每个单独的 CmakeLists.txt 的外观?

标签: c++ cmake clion


【解决方案1】:

从一个普通的 CMake 角度来看——所以我不知道这如何与 CLion 交互,但你在 cmets 中指出 write-the-CMakeLists.txt 是重要的部分——一种方法是:

  • 有一个顶级的 CMakeLists.txt,用于设置 CMake 参数、C++ 标准、编译器标志、选项等。
  • 完成所有设置后,add_subdirectory(dir1/)add_subdirectory(dir2/)
  • 之后,无论您需要什么顶级目标,例如add_executable(mytoplevelprogram main.cpp somelib.cpp)。如果 mytoplevelprogram 的构建需要库中的标头,请使用合适的 target_include_directories(mytoplevelprogram ...) 和/或链接到子目录中创建的工件
  • 在每个子目录 dir1dir2 中,编写一个 CMakeLists.txt 来查找依赖项并使用合适的 add_executable() 命令为该子目录构建可执行文件。

通常没有理由在源代码树中放置多个 project() 命令。

【讨论】:

  • 你的意思是我不需要在每个 CmakeLists.txt 的顶部有project() 命令吗?
猜你喜欢
  • 2014-08-26
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多