使用 clang 链接 C++ 模块 TS
Linking C++ modules TS using clang
我正在尝试将 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 会编译这些模块。据我了解,问题出在链接阶段。
有什么问题?
在生成模块 (foo.cppm) 中,您需要从模块定义中省略关键字 export
。
// foo.cppm
module foo;
export void test() {
}
其他一切都应该正常。
如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.cppm
和 bar.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
我正在尝试将 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 会编译这些模块。据我了解,问题出在链接阶段。
有什么问题?
在生成模块 (foo.cppm) 中,您需要从模块定义中省略关键字 export
。
// foo.cppm
module foo;
export void test() {
}
其他一切都应该正常。
如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.cppm
和 bar.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