从clang c ++ 20模块导出全局变量

问题描述

当使用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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...