c++ clang++错误:()from module()is not present in definition of()in module()

xt0899hw  于 2024-01-09  发布在  其他
关注(0)|答案(1)|浏览(162)

Clang和libc++版本:15.0.7

来源

as.cppm:

  1. export module as;
  2. import <boost/asio.hpp>;
  3. // import <iostream>;
  4. export int main() {
  5. }

字符串

编译

(需要boost库)

  1. clang++ -std=c++20 -stdlib=libc++ --precompile -xc++-system-header boost/asio.hpp
  2. #Produces `asio.pcm`
  3. clang++ -std=c++20 -stdlib=libc++ --precompile as.cppm -fmodule-file=asio.pcm
  4. #Produces `as.pcm`


一切都运行良好
但是如果我取消第3行的注解

来源:

as.cppm:

  1. export module as;
  2. import <boost/asio.hpp>;
  3. import <iostream>;
  4. export int main() {
  5. }

编译

(需要boost库)

  1. clang++ -std=c++20 -stdlib=libc++ --precompile -xc++-system-header boost/asio.hpp
  2. #Produces `asio.pcm`
  3. clang++ -std=c++20 -stdlib=libc++ --precompile -xc++-system-header iostream
  4. #Produces `iostream.pcm`
  5. clang++ -std=c++20 -stdlib=libc++ --precompile as.cppm -fmodule-file=asio.pcm -fmodule-file=iostream.pcm
  6. #Error

错误

pastebin
为什么它会产生这样的错误信息?我在谷歌上找不到类似的信息。
g++ 12.2在同一代码上产生 * 内部编译器错误 *

wh6knrhe

wh6knrhe1#

我遇到过和你类似的问题。
在我的示例中,我将<format><iostream>一起导入。

  1. $ clang++-18 -std=c++26 -x c++-system-header format iostream -stdlib=libc++
  2. # Produces `format.pcm` and `iostream.pcm`
  3. $ clang++-18 -std=c++26 -fmodule-file=format.pcm -fmodule-file=iostream.pcm -x c++ - -stdlib=libc++
  4. import <format>;
  5. import <iostream>;
  6. int main() { std::cout << std::format("clang {}\n", __clang_major__); }
  7. # Many errors like this:
  8. /usr/lib/llvm-18/bin/../include/c++/v1/string_view:344:5: error: 'std::basic_string_view<char>::basic_string_view' from module '/usr/lib/llvm-18/bin/../include/c++/v1/iostream' is not present in definition of 'std::string_view' in module '/usr/lib/llvm-18/bin/../include/c++/v1/format'

字符串
由于<format><iostream>都直接或间接地包含<string_view>,因此单独生成format.pcmiostream.pcm可能会混淆依赖关系,从而导致在解析import <format>;import <iostream>;时出现ODR检查和声明合并问题。(请参阅官方文档)
临时解决方法可能是先生成string_view.pcm,然后基于string_view.pcm生成format.pcmiostream.pcm

  1. $ clang++-18 -std=c++26 -x c++-system-header string_view -stdlib=libc++
  2. # Produces `string_view.pcm`
  3. $ clang++-18 -std=c++26 -fmodule-file=string_view.pcm -x c++-system-header format iostream -stdlib=libc++
  4. # Produces `format.pcm` and `iostream.pcm` (with the same `string_view.pcm` dependency)
  5. $ clang++-18 -std=c++26 -fmodule-file=format.pcm -fmodule-file=iostream.pcm -x c++ - -stdlib=libc++
  6. import <format>;
  7. import <iostream>;
  8. int main() { std::cout << std::format("clang {}\n", __clang_major__); }
  9. # Produces `a.out`
  10. $ ./a.out
  11. clang 18


在您的情况下,可以先生成stdexcept.pcm,然后基于stdexcept.pcm生成asio.pcmiostream.pcm
请记住,在编译器有稳定的支援之前,不要在实际执行环境中使用这个功能。您也可以尝试使用Standard Library Modules功能,这个功能会方便得多-只需要一个import std;陈述式。

展开查看全部

相关问题