当我安装了Clang 3.7时,它会从我的GCC安装中找到STL标题,只要路径中只包含这两个目录。
现在我已经安装了Clang 3.8,编译器不断找到Visual Studio头文件,尽管它甚至不在路径中
我的路径如下:
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位编译并链接到"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的默认目标(其中两者似乎都与{{1}相关)得到了非常相似的错误和类似的类型
看到这个我认为如果传递目标可能会修复VC编译器错误
虽然这种方式似乎有效但它只会产生更多问题,因为它一直要求libs链接到我并且我不知道正确的
所以我试过了:
char16_t
我不知道要传递的正确目录是什么。
我感觉我需要传递另一个lib文件,因为我收到此错误
libcmt.lib(thread_safe_statics.obj):错误LNK2019:未解析的外部符号__imp_CloseHandle
答案 0 :(得分:1)
你改变了目标吗? VC是新的默认值。将此(示例)用于x64,mingw:
clang ++ --target = x86_64-w64-mingw32 test.cpp
不要忘记链接器。