【发布时间】: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.ifc和file.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_command与add_custom_target(甚至可以使用预先创建的目标文件的add_executable)组合起来有什么问题?或者您希望自动解决模块之间的依赖关系? -
似乎 CLang 需要成为首选工具链,而不是 GCC。 stackoverflow.com/questions/33307657/… 至少我还没有找到任何提及 GCC 对 C++ 模块的支持。
-
请注意 cl 支持连字符作为切换字符
标签: c++ visual-c++ cmake c++-modules