【问题标题】:LLVM/Clang++ cannot find <iostream>LLVM/Clang++ 找不到 <iostream>
【发布时间】:2021-06-19 08:32:59
【问题描述】:

我的环境:

  • 系统:Windows 10
  • LLVM:12.0.0(预构建)和 clang 12.0.0(posix)
  • MinGW-W64:4.3.4(预建)和 gcc 7.3.0(posix)

MinGW-W64 和 LLVM 都添加到我的 PATH 中。
当我尝试用 clang++ 编译我的 Hello-World 时,它会喊:

clang++: warning: unable to find a Visual Studio installation; try running Clang from a developer command prompt [-Wmsvc-not-found]
test1.cpp:4:10: fatal error: 'iostream' file not found
#include <iostream>
         ^~~~~~~~~~
1 error generated.

当我添加-v 时,它不会搜索 g++ 标准库:

clang version 12.0.0
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: D:\.llvm12\bin
clang++: warning: unable to find a Visual Studio installation; try running Clang from a developer command prompt [-Wmsvc-not-found]
clang++: warning: argument unused during compilation: '-stdlib=libc++' [-Wunused-command-line-argument]
 "D:\\.llvm12\\bin\\clang++.exe" -cc1 -triple x86_64-pc-windows-msvc19.11.0 -emit-obj -mrelax-all -mincremental-linker-compatible --mrelax-relocations -disable-free -disable-llvm-verifier -discard-value-names -main-file-name test1.cpp -mrelocation-model pic -pic-level 2 -mframe-pointer=none -fmath-errno -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -tune-cpu generic -v -resource-dir "D:\\.llvm12\\lib\\clang\\12.0.0" -internal-isystem "D:\\.llvm12\\lib\\clang\\12.0.0\\include" -internal-isystem "C:/Program Files/Microsoft Visual Studio 10.0/VC/include" -internal-isystem "C:/Program Files/Microsoft Visual Studio 9.0/VC/include" -internal-isystem "C:/Program Files/Microsoft Visual Studio 9.0/VC/PlatformSDK/Include" -internal-isystem "C:/Program Files/Microsoft Visual Studio 8/VC/include" -internal-isystem "C:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/Include" -fdeprecated-macro -fdebug-compilation-dir "D:\\.tmp" -ferror-limit 19 -fmessage-length=120 -fno-use-cxa-atexit -fms-extensions -fms-compatibility -fms-compatibility-version=19.11 -std=c++14 -fdelayed-template-parsing -fcxx-exceptions -fexceptions -fcolor-diagnostics -faddrsig -o "C:\\Users\\lenovo\\AppData\\Local\\Temp\\test1-4517aa.o" -x c++ test1.cpp
clang -cc1 version 12.0.0 based upon LLVM 12.0.0 default target x86_64-pc-windows-msvc
ignoring nonexistent directory "C:/Program Files/Microsoft Visual Studio 10.0/VC/include"
ignoring nonexistent directory "C:/Program Files/Microsoft Visual Studio 9.0/VC/include"
ignoring nonexistent directory "C:/Program Files/Microsoft Visual Studio 9.0/VC/PlatformSDK/Include"
ignoring nonexistent directory "C:/Program Files/Microsoft Visual Studio 8/VC/include"
ignoring nonexistent directory "C:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/Include"
#include "..." search starts here:
#include <...> search starts here:
 D:\.llvm12\lib\clang\12.0.0\include
End of search list.
test1.cpp:4:10: fatal error: 'iostream' file not found
#include <iostream>
         ^~~~~~~~~~
1 error generated.

我是否安装了错误版本的 LLVM 或 MinGW-W64?

编辑 1:
我尝试使用--target=x86_64-w64-windows-gnu 来编译一段明显错误的代码:

// test3.cpp
#include <iostream>
int main() {
    cout << "\n";
    return 0;
}

然后它给了我一个满意的回应:

test3.cpp:4:2: error: use of undeclared identifier 'cout'; did you mean 'std::cout'?
        cout << "\n";
        ^~~~
        std::cout
D:\.mingw64\lib\gcc\x86_64-w64-mingw32\7.3.0\include\c++\iostream:61:18: note: 'std::cout' declared here
  extern ostream cout;          /// Linked to standard output
                 ^
1 error generated.

我想将--target=x86_64-w64-windows-gnu 添加到我的默认设置中。我该怎么做?

【问题讨论】:

    标签: c++ clang llvm clang++


    【解决方案1】:

    在 Windows 上,Clang 默认以 MSVC 兼容模式运行,使用其标准库和各种头文件。

    要使其在 MinGW 兼容模式下运行,请添加以下标志:--target=x86_64-w64-windows-gnu。或者,如果您针对 x32 位而不是 x64 进行编译,请将 x86_64 替换为 i686

    或者,卸载您的 Clang(以及 MinGW)并从 MSYS2 重新安装它们。他们的 Clang 构建默认使用这个标志。此外,他们提供的 GCC 版本比您的更新(10.3 与 7.3)。

    另外,根据-stdlib=libc++ 判断,您正在尝试在 Windows 上使用 libc++。我不认为官方的 Clang 版本为 Windows 提供了它,但 MSYS2 的人可以。

    【讨论】:

    • 我尝试了stdlib=libc++ 和使用 MSYS2,但结果相同。
    • c // test3.cpp #include &lt;iostream&gt; int main() { cout &lt;&lt; "\n"; return 0; } 为了验证您的解决方案,我尝试使用--target=x86_64-w64-windows-gnu 编译这段充满错误的代码,我对其响应感到满意:``` test3.cpp:4:2: error :使用未声明的标识符“cout”;你的意思是'std :: cout'吗? cout
    • @TeddyLi 好的,照它说的做?将cout 替换为std::cout?
    • 我当然知道。我只想将--target=x86_64-w64-windows-gnu 添加到我的默认设置中。我是stackoverflow的新手,所以请原谅我把格式弄得一团糟。
    • @TeddyLi 啊,好的。如果直接从控制台编译,则每次都必须指定标志。如果您使用某种 IDE 或构建系统,您可以将标志放在那里。或者,正如我所说,您可以从 MSYS2 重新安装编译器,并默认使用此标志。
    猜你喜欢
    • 2012-04-26
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 2015-02-14
    • 2017-07-11
    • 1970-01-01
    相关资源
    最近更新 更多