先决条件
首先确保:1、已经正确安装clang,并且clang的bin文件夹已经加入path环境变量中(我的是clang 8.0.1);2、已经正确安装mingw,并且mingw的bin文件夹已经加入path环境变量中(我的是mingw64 8.1.0);3、已经正确安装codeblocks
第一步:观察clang的编译现象
我们用命令行来尝试。首先写一个简单的helloworld,文件名为main.cpp。
#include <stdio.h>
int main(int argc, char* argv[]) {
printf("Hello World!\n");
return 0;
}
在命令行下执行:
clang++ main.cpp -o main.exe
发现下列报错:
其实,查看clang的安装目录就可见,clang仅仅是个编译器外壳,并没有include标准库。难怪他找不到stdio.h。
第二步:修改target编译选项
经过不懈Google,终于在stack overflow上找到了答案。
命令行下查看:clang++ -v 和 g++ -v
target并不相同,g++的target是mingw,但clang的target是msvc(也就是microsoft visual c++)。
因此,我们的办法就是编译时手动设置target选项为mingw:
特别注意:如果你的mingw是32位,则target设置为mingw32;64位则设置为x86_64-w64-mingw32。具体是哪一个,可以通过g++ -v来查看,但无论如何必须保证clang的target与g++保持完全一致!!
根据昨天一位同学反映的问题,codeblocks自带的mingw32和clang不兼容,因为clang是64位的。所以,大家最好单独安装mingw64!并把其下的bin目录加入path中!mingw64的8.1.0版本在这里:链接:https://pan.baidu.com/s/1thgOjU-zIIYOF2Gq-8_ueg,提取码:cerh,无需安装,直接解压(解压后大小约460MB),然后添加path变量即可!另外,如果之前在path中添加过mingw32的bin目录,一定要记住删除!
clang++ --target=x86_64-w64-mingw32 main.cpp -o main.exe
这次编译成功了:
第三步:修改codeblocks编译器设置
每次都命令行编译,多麻烦。所以,我们在codeblocks中集成一下。
菜单栏settings–compiler:
选择编译器为LLVM clang。然后,我们要给编译器加上–target这个选项。
右击任意一个选项,弹出菜单中选择“新标记”。
把这个选项命名为target设置。然后,把编译器选项和连接器选项都加上–target=x86_64-w64-mingw32。单击确定。
一定要记住勾选这个新添加的选项。
然后,设置“可执行工具链”:
单击确定。
然后创建新工程试验一下。注意在这一步,必须选择LLVM clang编译器:
创建后,编译运行:
完美解决!
美中不足
我们在修改编译器之后,发现,编辑代码时没有任何代码提示。这就是刚才所说的,clang没有include标准库导致的,所以,如果用cb直接配置的话,就忍忍吧!