当使用 clang 12 构建 c++20 模块时(它也使用 clang 10 重现)从模块导出全局变量并在另一个编译单元中从同一个导出类声明全局变量会导致“'vtable for foo'的多重定义” ”。
我的理解是,c++20 模块可以使用单个 cppm 源创建(clang 对模块使用 cppm),并且编译器将从它生成模块声明和定义。在这种情况下,clang++ 似乎确实生成了两次 vtable。
这是设置
foo.cppm:
export module foo;
export struct foo {
virtual void vf();
};
void foo::vf() {}
export foo module_foo; // variable, exported
Run Code Online (Sandbox Code Playgroud)
主.cpp:
import foo;
foo main_foo;
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
构建主可执行文件的编译步骤:
/usr/lib/llvm-12/bin/clang++ -std=c++20 -fmodules --precompile foo.cppm -o foo.pcm
/usr/lib/llvm-12/bin/clang++ -std=c++20 -fmodules --compile foo.cppm -o foo.o
/usr/lib/llvm-12/bin/clang++ -std=c++20 -fmodules -fmodule-file=foo.pcm --compile main.cpp -o main.o
/usr/lib/llvm-12/bin/clang++ -std=c++20 -fmodules foo.o …Run Code Online (Sandbox Code Playgroud)