【问题标题】:How to use VC++ modules in CMake如何在 CMake 中使用 VC++ 模块
【发布时间】:2016-05-15 19:04:36
【问题描述】:

MS Visual C++ 2015 更新 1 implements the Modules proposal

以下是其工作原理的示例:
资料来源:

// c.ixx             |  // b.ixx                   |  // a.cpp
module GM;           |  import GM;                 |  import FM;
export void g() {}   |  module FM;                 |  int main() { f(); }
                     |  export void f() { g(); }   | 

构建命令:

set CL=/EHsc /experimental:module   # Default flags for cl.exe
cl.exe /c c.ixx                     # Produces c.obj, GM.ifc
cl.exe /c b.ixx                     # Depends on GM.ifc, produces b.obj, FM.ifc
cl.exe /c a.cpp                     # Depends on FM.ifc, produces a.obj
link.exe a.obj b.obj c.obj          # Produces a.exe

依赖图:

c.ixx → GM.ifc → b.ixx → FM.ifc → a.cpp
     ↘            ↓             ↙
       c.obj     b.obj    a.obj
            ↘     ↓      ↙
                 a.exe

每个模块都有一个 file.ixx 及其导出。
这个文件会被编译成ModuleName.ifcfile.obj

如果文件导入模块M,则必须存在M.ifc 文件。
默认情况下 cl.exe 在当前目录中搜索.ifc 文件,但可以指定显式名称或搜索路径:

cl.exe /c a.cpp
-- or --
cl.exe /c a.cpp /module:reference FM.ifc
-- or --
cl.exe /c a.cpp /module:search ./

那么,问题来了:如何在CMake中使用VC++实现模块
不需要使用 MSBuild 后端,Ninja 也可以。

【问题讨论】:

  • 那么,将具有适当 OUTPUT 和 DEPENDS 部分的命令add_custom_commandadd_custom_target(甚至可以使用预先创建的目标文件的add_executable)组合起来有什么问题?或者您希望自动解决模块之间的依赖关系?
  • 似乎 CLang 需要成为首选工具链,而不是 GCC。 stackoverflow.com/questions/33307657/… 至少我还没有找到任何提及 GCC 对 C++ 模块的支持。
  • 请注意 cl 支持连字符作为切换字符

标签: c++ visual-c++ cmake c++-modules


【解决方案1】:

我认为目前没有人为 C++ 模块完成任何构建系统工作。我们(微软)很可能会首先支持 MSBuild,但 CMake 绝对是可能的。

【讨论】:

  • 如你所知,cmake 是一个生成器,并且 afaik 支持两个直接可执行的后端:各种 makefile 变体和 ninja。在您执行任何操作之前,其他生成器带来了另一个级别的间接性。目前正在标准化的 C++ 模块的“问题”是,用这些后端支持它们将是非常神秘的。
猜你喜欢
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
相关资源
最近更新 更多