如何使用 Clang 编译 C++?
Posted
技术标签:
【中文标题】如何使用 Clang 编译 C++?【英文标题】:How do I compile C++ with Clang? 【发布时间】:2012-02-27 05:48:17 【问题描述】:我已经在 Ubuntu 中使用 apt-get 安装了Clang,我可以使用它成功编译 C 文件。但是,我不知道如何通过它编译 C++。编译 C++ 需要做什么?
【问题讨论】:
【参考方案1】:命令clang
用于C,命令clang++
用于C++。
【讨论】:
【参考方案2】:我不知道为什么没有直接解决问题的答案。当你
想编译C++程序,最好使用clang++
。例如,
以下对我有用:
clang++ -Wall -std=c++11 test.cc -o test
如果编译正确,会产生可执行文件test
,你可以
使用./test
运行文件。
或者你可以使用clang++ test.cc
来编译程序。它会产生一个
默认可执行文件名为a.out
。使用./a.out
运行文件。
如果你熟悉g++,整个过程很像g++。请参阅 this
post 以检查 -Wall
选项中包含哪些警告。 This
page 显示 Clang 支持的诊断标志列表。
关于使用clang -x c++
的说明:Kim Gräsman 说你也可以使用
clang -x c++
编译 cpp 程序,但这可能不是真的。例如,
我在下面有一个简单的程序:
#include <iostream>
#include <vector>
int main()
/* std::vector<int> v = 1, 2, 3, 4, 5; */
std::vector<int> v(10, 5);
int sum = 0;
for (int i = 0; i < v.size(); i++)
sum += v[i]*2;
std::cout << "sum is " << sum << std::endl;
return 0;
clang++ test.cc -o test
会编译成功,但clang -x c++
会
不,显示了很多未定义的引用错误。所以我猜他们不完全是
相等的。最好使用clang++
而不是clang -x c++
时
编译 c++ 程序以避免额外的麻烦。
【讨论】:
感谢您实际回答问题。 @jdhao 感谢您的详细回答。但有一件事我不明白。你说“当你想编译 C++ 程序时,最好使用 clang++”。为什么不推荐使用g++
?
@Mr.Robot 我的意思是最好使用clang++
编译cpp,与使用clang
相比,而不是与使用g++
相比。
在 Windows 上怎么样?
@Andrew 我不在 Windows 上使用 clang。所以我不确定。如果你在 Windows 上使用 clang,很容易验证。【参考方案3】:
此外,为了后代——Clang(如 GCC)接受 -x
开关来设置输入文件的语言,例如,
$ clang -x c++ some_random_file.txt
这个邮件列表线程很好地解释了clang
和clang++
之间的区别:Difference between clang and clang++
【讨论】:
在使用#include <iostream>
编译 cpp 文件时,我遇到了与 clang -x c++ 相关的链接器错误。 -lstdc++ 标志解决了这个问题。
Clang 的源代码现在摆在我的眼前。在构建期间(在 Windows 上),它首先构建 clang.exe
,然后将该可执行文件复制到 clang++.exe
。所以它是同一个可执行文件,只是在运行时它会检查自己的名称以区分是作为 C 编译器还是 C++ 编译器。 HTH。
请注意,-x c++
选项作为 -extra-arg
提供给 clang-tidy 非常有用,可以强制它将 .h 文件视为包含C++ 而不是 C。
除非你从源代码构建整个东西,否则这太局限了,实际上没有用。最好只使用clang++
并让它检测您提供给它的文件类型。当一个项目可以包含 .cpp
文件、.ll
文件 (llvm ir) 和 .o
、.a
、.so
以及来自第三方库的文件时,clang -x c++
就会抛出。
我也看到了与@Slav 相同的问题。对于一个非常简单的程序,clang++
有效,但clang -x c++
显示了很多未定义的引用错误(其他标志相同)。所以我想最好使用clang++
。测试的 clang 版本:11.0.0.【参考方案4】:
我在从源代码构建 Clang 时遇到了类似的问题(但不是使用 sudo apt-get install
。这可能取决于您运行的 Ubuntu 版本)。
检查clang++
是否可以找到您的 C++ 库的正确位置可能是值得的:
比较g++ -v <filename.cpp>
和clang++ -v <filename.cpp>
的结果,在“#include search starts here:”下。
【讨论】:
【参考方案5】:解决方案 1:
clang++ your.cpp
解决方案 2:
clang your.cpp -lstdc++
解决方案 3:
clang -x c++ your.cpp
【讨论】:
【参考方案6】:打开终端窗口并导航到您的项目目录。运行这些命令集,具体取决于您安装的编译器:
使用 clang++ 编译多个 C++ 文件:
$ clang++ *.cpp
$ ./a.out
使用 g++ 编译多个 C++ 文件:
$ g++ -c *.cpp
$ g++ -o temp.exe *.o
$ ./temp.exe
【讨论】:
以上是关于如何使用 Clang 编译 C++?的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 Clang 的 Boost 编译 c++ 项目时出现问题
如何使用 LLVM 在 Windows 上为 ARM 编译 C++ 程序?