clang++-16中同时导入<string>和<iostream>编译报错问题
同一文件导入和时出现clang编译错误,有解决方法吗?
在使用Clang 16 + libc以C20模块方式同时导入<string>和<iostream>时,出现模块定义冲突的编译错误,以下是问题详情及临时解决办法:
复现步骤
编译命令(基于Clang官方文档)
clang++-16 -std=c++20 -stdlib=libc++ -xc++-system-header --precompile "/usr/lib/llvm-16/include/c++/v1/iostream" -o "build/.mm3/default/iostream.pcm" -Wno-pragma-system-header-outside-header -Wno-user-defined-literals clang++-16 -std=c++20 -stdlib=libc++ -xc++-system-header --precompile "/usr/lib/llvm-16/include/c++/v1/string" -o "build/.mm3/default/string.pcm" -Wno-pragma-system-header-outside-header -Wno-user-defined-literals clang++-16 -std=c++20 -stdlib=libc++ "apa.cpp" -fmodule-file="build/.mm3/default/iostream.pcm" -fmodule-file="build/.mm3/default/string.pcm" -c -o "build/.mm3/default/apa.o"
待编译代码(apa.cpp)
// apa.cpp import <iostream>; import <string>; int print() { std::cout << "hello" << std::endl; return 10; }
编译错误信息
In module '/usr/lib/llvm-16/include/c++/v1/iostream': /usr/lib/llvm-16/bin/../include/c++/v1/string_view:301:5: error: 'std::basic_string_view<char>::basic_string_view' from module '/usr/lib/llvm-16/include/c++/v1/iostream' is not present in definition of 'std::string_view' in module '/usr/lib/llvm-16/include/c++/v1/string' basic_string_view(const _CharT* __s, size_type __len) _NOEXCEPT ^ /usr/lib/llvm-16/bin/../include/c++/v1/string_view:267:5 : note: definition has no member 'basic_string_view' basic_string_view { ^ ...(省略重复错误信息)
临时解决方法
由于<iostream>模块已经间接引入了std::string的相关定义,只需移除对<string>的显式导入,代码即可正常编译:
import <iostream>; // import <string>; int print() { std::cout << "hello" << std::endl; std::string str = "satnhoeu"; return 10; }
该问题属于Clang/libc++的模块实现bug,目前只能通过上述方案规避,等待官方修复。
内容的提问来源于stack exchange,提问作者Lasersköld
相关产品推荐
相关产品推荐

