Linking C++ modules TS using clang

时间:2018-02-03 11:23:09

标签: c++ clang c++-modules

I'm trying to use C++ modules TS with clang.

I've created two files:

// foo.cppm
export module foo;

export void test() {
}

and

// bar.cpp
import foo;

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

I compile foo.cppm with this command

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

It compiles without an error and creates a foo.pcm file, but when i try to compile a binary with this command:

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

it prints an error:

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

I tried it with clang 7 trunk and clang 6. Also i tried different std options and this command:

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

And nothing helps.

Interesting enough that if one module uses symbols from other, clang compiles these modules. So as i understand the problem is in linking stage.

What can be a problem?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

export

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