问题描述
当使用clang 12构建c ++ 20模块时(也使用clang 10进行复制),从模块导出全局变量并在另一个编译单元中从同一导出类声明全局变量会导致“ vtable的多个定义”为foo'“。
我的理解是,可以使用单个cppm源创建c ++ 20模块(clang对模块使用cppm),并且编译器将从中生成模块声明和定义。在这种情况下,似乎clang ++确实生成了两次vtable。
这是设置
foo.cppm:
export module foo;
export struct foo {
virtual void vf();
};
void foo::vf() {}
export foo module_foo; // variable,exported
main.cpp:
import foo;
foo main_foo;
int main() {
return 0;
}
构建主要可执行文件的编译步骤:
/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 main.o -o main
产生重复的vtable并输入foo类的信息:
/usr/bin/ld: main.o:(.rodata+0x20): multiple deFinition of `typeinfo for foo'; foo.o:(.rodata+0x20): first defined here
/usr/bin/ld: main.o:(.rodata+0x18): multiple deFinition of `typeinfo name for foo'; foo.o:(.rodata+0x18): first defined here
/usr/bin/ld: main.o:(.rodata+0x0): multiple deFinition of `vtable for foo'; foo.o:(.rodata+0x0): first defined here
这是llvm错误还是我做错了什么,我对模块的工作方式感到困惑?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)