WIndows 上的 Clang 找到 VC headers 而不是 GCC
Clang on WIndows finds VC headers instead of GCC
当我安装 Clang 3.7 时,只要路径中只有这两个目录,它就会从我的 GCC 安装中找到 STL headers。
现在我已经安装了 Clang 3.8,编译器一直在寻找 Visual Studio headers,尽管它甚至不在路径中
我的路径如下:
PATH=whatever;G:\Compilers\LLVM\bin;g:\compilers\Mingw64-64bit\bin
编辑 1
我知道正确的包含路径是什么,但我尝试在 Codelite 中进行编译,发现了这些:
"-IG:\Compilers\Mingw64-64bit\x86_64-w64-mingw32\include\c++"
"-IG:\Compilers\Mingw64-64bit\x86_64-w64-mingw32\include\c++\x86_64-w64-mingw32"
"-IG:\Compilers\Mingw64-64bit\lib\gcc\x86_64-w64-mingw32\5.1.0\include"
"-IG:\Compilers\Mingw64-64bit\lib\gcc\x86_64-w64-mingw32\5.1.0\include-fixed" "-IG:\Compilers\Mingw64-64bit\x86_64-w64-mingw32\include"
"-IG:\Compilers\Mingw64-64bit\x86_64-w64-mingw32\include\c++\backward"
我也在使用方言标志--std=c++11
然而,使用 C++ 库的一个非常简单的程序给我错误,例如
G:\Compilers\Mingw64-64bit\x86_64-w64-mingw32\include\c++\bits/stringfwd.h:63:33: error: use of undeclared identifier 'char16_t'
template<> struct char_traits<char16_t>;
^
编辑 2
现在按照 Martin 的建议通过 x86_64-w64-mingw32
,自动发现过程似乎有效,但生成的可执行文件只是冻结。
我在尝试使用 VS2015 Clang 工具集时发现了同样的情况
我使用的代码示例是这个
#include <iostream>
int main()
{
int arr[] = {1, 2, 3, 4, 5};
for(auto el : arr)
{
std::cout << el << std::endl;
}
return 0;
}
我现在正在编译:
clang++ -v --target=x86_64-w64-mingw32 hello.cpp -o test.exe -std=c++14
我查看了使用 Dependency Walker 生成的可执行文件,它显示为 64 位编译并且 linking 到 "g:\Compilers\Mingw64-32Bit\bin\libstdc++-6.dll"
我认为下一步是尝试编译 32 位版本,但我似乎无法找到正确的目标名称
我刚试过clang++ hello.cpp -o main.exe -std=c++14 --target=i686-pc-mingw32 -v
这似乎是在生成 32 位可执行文件,但它再次冻结
注意我更新了指向 32 位 clang 的路径。
编辑 3
让我感到困惑的是,在我通过 x86_64-w64-mingw32 作为目标之前,我从通过 GCC 路径和从 MSVC 的默认目标中得到了非常相似的错误,两者似乎都与 char16_t
和类似类型
相关
看到这个我想我会尝试传递一个目标是否可以修复 VC 编译器错误
虽然这种方法似乎有效,但它只会产生更多问题,因为它一直要求 link 的库,但我不知道正确的
所以我尝试了:
clang++ hello.cpp -o main-vc.exe -std=c++14 --target=x86_64-pc-windows-msvc19.0.0 -v
-Xlinker "c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\amd64\libcmt.lib"
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\amd64\libcpmt.lib"
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\amd64\libvcruntime.lib"
"C:\Program Files (x86)\Windows Kits\Lib.0.10586.0\ucrt\x64\libucrt.lib"
我不知道要传递的正确目录是什么。
我觉得我需要传递另一个 lib 文件,因为我收到这个错误
libcmt.lib(thread_safe_statics.obj):错误 LNK2019:未解析的外部符号 __imp_CloseHandle
你改变目标了吗? VC 是新的默认值。将此(示例)用于 x64,mingw:
clang++ --target=x86_64-w64-mingw32 test.cpp
也不要忘记链接器。
当我安装 Clang 3.7 时,只要路径中只有这两个目录,它就会从我的 GCC 安装中找到 STL headers。
现在我已经安装了 Clang 3.8,编译器一直在寻找 Visual Studio headers,尽管它甚至不在路径中
我的路径如下:
PATH=whatever;G:\Compilers\LLVM\bin;g:\compilers\Mingw64-64bit\bin
编辑 1
我知道正确的包含路径是什么,但我尝试在 Codelite 中进行编译,发现了这些:
"-IG:\Compilers\Mingw64-64bit\x86_64-w64-mingw32\include\c++"
"-IG:\Compilers\Mingw64-64bit\x86_64-w64-mingw32\include\c++\x86_64-w64-mingw32"
"-IG:\Compilers\Mingw64-64bit\lib\gcc\x86_64-w64-mingw32\5.1.0\include"
"-IG:\Compilers\Mingw64-64bit\lib\gcc\x86_64-w64-mingw32\5.1.0\include-fixed" "-IG:\Compilers\Mingw64-64bit\x86_64-w64-mingw32\include"
"-IG:\Compilers\Mingw64-64bit\x86_64-w64-mingw32\include\c++\backward"
我也在使用方言标志--std=c++11
然而,使用 C++ 库的一个非常简单的程序给我错误,例如
G:\Compilers\Mingw64-64bit\x86_64-w64-mingw32\include\c++\bits/stringfwd.h:63:33: error: use of undeclared identifier 'char16_t'
template<> struct char_traits<char16_t>;
^
编辑 2
现在按照 Martin 的建议通过 x86_64-w64-mingw32
,自动发现过程似乎有效,但生成的可执行文件只是冻结。
我在尝试使用 VS2015 Clang 工具集时发现了同样的情况
我使用的代码示例是这个
#include <iostream>
int main()
{
int arr[] = {1, 2, 3, 4, 5};
for(auto el : arr)
{
std::cout << el << std::endl;
}
return 0;
}
我现在正在编译:
clang++ -v --target=x86_64-w64-mingw32 hello.cpp -o test.exe -std=c++14
我查看了使用 Dependency Walker 生成的可执行文件,它显示为 64 位编译并且 linking 到 "g:\Compilers\Mingw64-32Bit\bin\libstdc++-6.dll"
我认为下一步是尝试编译 32 位版本,但我似乎无法找到正确的目标名称
我刚试过clang++ hello.cpp -o main.exe -std=c++14 --target=i686-pc-mingw32 -v
这似乎是在生成 32 位可执行文件,但它再次冻结
注意我更新了指向 32 位 clang 的路径。
编辑 3
让我感到困惑的是,在我通过 x86_64-w64-mingw32 作为目标之前,我从通过 GCC 路径和从 MSVC 的默认目标中得到了非常相似的错误,两者似乎都与 char16_t
和类似类型
看到这个我想我会尝试传递一个目标是否可以修复 VC 编译器错误
虽然这种方法似乎有效,但它只会产生更多问题,因为它一直要求 link 的库,但我不知道正确的
所以我尝试了:
clang++ hello.cpp -o main-vc.exe -std=c++14 --target=x86_64-pc-windows-msvc19.0.0 -v
-Xlinker "c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\amd64\libcmt.lib"
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\amd64\libcpmt.lib"
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\amd64\libvcruntime.lib"
"C:\Program Files (x86)\Windows Kits\Lib.0.10586.0\ucrt\x64\libucrt.lib"
我不知道要传递的正确目录是什么。
我觉得我需要传递另一个 lib 文件,因为我收到这个错误
libcmt.lib(thread_safe_statics.obj):错误 LNK2019:未解析的外部符号 __imp_CloseHandle
你改变目标了吗? VC 是新的默认值。将此(示例)用于 x64,mingw:
clang++ --target=x86_64-w64-mingw32 test.cpp
也不要忘记链接器。