如何在CMake中使用VC++模块
问题描述:
MS Visual C++ 2015 Update 1 implements the Modules proposal。如何在CMake中使用VC++模块
这里是它是如何工作的一个例子:
来源:
// 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 ./
所以,问题是:如何使用VC++实现的模块中的CMake ?
没必要使用MSBuild后端,忍者也很好。
答
我不相信任何人目前都在为C++模块完成任何构建系统工作。很可能我们(微软)会先做MSBuild支持,但CMake肯定是可能的。
+1
[build2](https://build2.org/)支持模块。 –
因此,将具有合适的OUTPUT和DEPENDS部分的命令'add_custom_command'与'add_custom_target'(甚至是'add_executable',它可以使用预先创建的目标文件)结合起来会出现什么问题?或者你想**自动**解决模块之间的依赖关系? – Tsyvarev
似乎CLang需要成为首选的工具链,而不是GCC。 http://stackoverflow.com/questions/33307657/how-do-i-use-modules-in-clang至少我还没有找到任何提及GCC对C++模块的支持。 –