【问题标题】:How to add source files in another folder如何在另一个文件夹中添加源文件
【发布时间】:2014-09-01 16:14:35
【问题描述】:

我正在使用 cmake 在 C++ 中构建我的项目。假设我的源文件夹中有以下目录

Source
  |_Dir1
  |   |_Class.cpp
  |   |_Class.hpp
  |
  |_Dir2
      |_Main.cpp

在 Dir1 中有一个类及其头文件和实现文件(Class.cpp 和 Class.hpp)。

在 Dir2 中有一个使用 Dir1 中的类的主应用程序

告诉 Dir2 中的 CMakeLists 使用 Dir1/Class.cpp 文件构建可执行文件的好方法是什么?

编辑: 更具体地说,我想定义 Class.cpp 的源文件必须在 Dir1 的 CMakeLists.txt 中使用,而不是在 Dir2 中。以另一种方式做这件事对我来说是完全错误的,而且很难使用,所以如果他们强制我这样做是有原因的,那么对这个主题进行一些澄清会很好。

我目前正在做的是对 Dir2/CMakeLists.txt 中的 Class.cpp 文件位置进行硬编码,但是当我有一堆类一起交互时,这无法扩展。

【问题讨论】:

  • 您可以使用FILE(GLOB ...) 操作来收集一堆具有特定扩展名的文件。
  • 但这不是只在 Dir2 内部有效吗?我想使用 Dir1 中的 cpp 文件。我特别希望不必指定可执行文件夹的 CMakeLists 中的所有文件,而是让每个文件夹注册它拥有的 cpps。
  • @Setzer22 您可以使用RELATIVE 选项来指定您想要的任何目录。看看 CMake 的手册怎么样?
  • @πάντα ῥεῖ 我不确定我是否理解相关函数的作用。你确定这可以帮助我从另一个文件夹定义我的可执行文件的源文件吗?

标签: cmake


【解决方案1】:

假设您在 Source 目录中有一个 CMakeLists.txt 文件,您将使用不同的 file() 命令创建两个变量

file(GLOB Dir1_Sources RELATIVE "Dir1" "*.cpp")
file(GLOB Dir2_Sources RELATIVE "Dir2" "*.cpp")

并将file() 命令生成的两个集合添加到目标的源列表中:

add_executable(MyProgram ${Dir1_Sources} ${Dir2_Sources})

或者,您可以将CMakeLists.txt 文件放在Dir1Dir2(主)下,如下所示

Source
    |
    |_ CMakeLists.txt   
    |    > project(MyProgram)
    |    > cmake_minimum_required(VERSION 3.8)
    |    > add_subdirectory("Dir1")
    |    > add_subdirectory("Dir2")
    |
    |_ Dir1   
    |     |_ CMakeLists.txt   
    |         > file(GLOB Sources "*.cpp")
    |         > add_library(Dir1 STATIC ${Sources})
    |_ Dir2   
          |_ CMakeLists.txt   
              > file(GLOB Sources "*.cpp")
              > add_executable(MyProgram ${Sources})
              > target_link_libraries(MyProgram Dir1)

添加子目录作为链接到您的主要目标的更多(静态)库。

【讨论】:

  • 我要的是行文件(GLOB Dir1_Sources RELATIVE "Dir1" "*.cpp") 位于不同的 CMakeLists.txt 文件中,即 Dir1 中的文件,而不是 Source 或 Dir2 .但我发现这不是 CMake 的工作流程,因为互联网上的每个人似乎都坚持在一个文件上做所有事情。无论如何,你的技巧很不错,谢谢。
  • @Setzer22 是的,这个示例当然假设您在Source 级别有一个CMakeLists.txt。好吧,尽管您也可以在(非主)子目录中放置适当的 CMakeLists.txt 文件来构建库,并使用 add_subdirectory() 添加这些文件,但正如您所提到的,这不是从源代码收集的常用方法。
  • @Setzer22 我为上述替代解决方案添加了另一个示例。
  • 为了取悦 CLion,我做了一些修改。重要的是,add_executable 需要在 target_link_libraries 之前,否则 cmake 会报错。
  • 不知道为什么这里使用 RELATIVE,但是 file(GLOB Dir1_Sources RELATIVE "Dir1" "*.cpp") 行在 CMakeLists.txt 中执行,不收集 @987654341 中的源@子目录。正确的调用是file(GLOB Dir1_Sources "Dir1/*.cpp")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 2012-04-25
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多