0

我正在尝试将 C++ 模块 TS 与 clang 一起使用。

我创建了两个文件:

// foo.cppm
export module foo;

export void test() {
}

// bar.cpp
import foo;

int main() {
  test();
  return 0;
}

foo.cppm我用这个命令编译

clang++ --std=c++17 -fmodules-ts --precompile foo.cppm -o foo.pcm

它编译没有错误并创建一个foo.pcm文件,但是当我尝试使用此命令编译二进制文件时:

clang++ --std=c++17 -fmodules-ts -fprebuilt-module-path=. -fmodule-file=foo.pcm bar.cpp

它打印一个错误:

/tmp/bar-f69a1f.o: In function `main':
bar.cpp:(.text+0x10): undefined reference to `test()'

我用 clang 7 trunk 和 clang 6 进行了尝试。我还尝试了不同的std选项和这个命令:

clang++ --std=c++17 -fmodules-ts -fmodule-file=foo.pcm bar.cpp -o bar

没有任何帮助。

有趣的是,如果一个模块使用来自其他模块的符号,clang 会编译这些模块。据我了解,问题出在链接阶段。

有什么问题?

4

2 回答 2

5

就像https://blogs.msdn.microsoft.com/vcblog/2015/12/03/c-modules-in-vs-2015-update-1/所说,.cppm (.ixx) 转换为 .pcm (. ifc).o (.obj)。

但与自动生成这两个文件的 cl.exe 不同,Clang 的 .o 文件必须从其 .pcm 文件编译:

clang++ --std=c++17 -fmodules-ts -c foo.pcm -o foo.o

使用foo.cppmbar.cpp以上,命令将如下所示:

clang++ --std=c++17 -fmodules-ts --precompile foo.cppm -o foo.pcm
clang++ --std=c++17 -fmodules-ts -c foo.pcm -o foo.o
clang++ --std=c++17 -fmodules-ts -fprebuilt-module-path=. foo.o bar.cpp
于 2018-03-16T13:30:30.257 回答
0

在生产模块 (foo.cppm) 中,您需要export从模块定义中省略关键字。

// foo.cppm
module foo;

export void test() {
}

其他一切都应该正常工作。

于 2018-02-03T12:10:38.277 回答