如何使用Clang编译C++代码?

136

我已经使用apt-get在Ubuntu上安装了Clang,并且可以成功地使用它编译C文件。然而,我不知道如何通过它来编译C++。我需要做什么来编译C++?

6个回答

201

clang 命令用于 C 语言,而 clang++ 命令用于 C++ 语言。


107

我不知道为什么没有直接解决问题的答案。当你想编译C++程序时,最好使用clang++,而不是使用clang。例如,以下代码适用于我:

clang++ -Wall -std=c++11 test.cc -o test

如果编译正确,它将产生可执行文件test,您可以使用./test运行该文件。

或者您可以直接使用clang++ test.cc来编译程序。它将生成一个名为a.out的默认可执行文件。使用./a.out来运行该文件。

整个过程很像g++,如果您熟悉g++的话。请参见这篇文章以查看包含在-Wall选项中的警告列表。此页面列出了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++ 不能,会显示许多未定义的引用错误。因此,我认为它们并不完全等价。在编译C++程序时最好使用 clang++ 而不是 clang -x c++,以避免额外的麻烦。

  • clang版本:11.0.0
  • 平台:Ubuntu 16.04

12
感谢你真正回答了问题。 - Curyous
@jdhao 感谢您详细的回答。但是有一件事我不明白。您说:“当您想编译C++程序时,最好使用clang++”。为什么不推荐使用g++呢? - Mr.Robot
3
@Mr.Robot 我的意思是,在编译C++时最好使用clang++,而不是使用clang,并非与使用g++相比较。 - jdhao
在Windows上怎么样? - Andrew
@Andrew 我在Windows上不使用clang,所以我不确定。如果你在Windows上使用clang,那么很容易验证。 - jdhao

57

此外,为了后代记录——Clang(像GCC一样)接受-x开关来设置输入文件的语言,例如:

$ clang -x c++ some_random_file.txt

这个邮件列表线程很好地解释了clangclang++之间的区别:Difference between clang and clang++


5
当我用“#include <iostream>”编译cpp文件时,出现了一个与_clang -x c++相关的链接错误。使用-lstdc++_标志解决了这个问题。请注意,此处不提供任何解释。 - Slav
1
我现在眼前有Clang的源代码。在构建过程中(在Windows上),它首先构建clang.exe,然后将该可执行文件复制到clang++.exe中。因此,它是相同的可执行文件,只是在运行时检查自己的名称以区分是作为C还是C++编译器运行。希望对你有所帮助。 - Serge Rogatch
作为一种提示,将选项“-x c ++”作为“clang-tidy”的“-extra-arg”给出非常有用,可以强制它将.h文件视为包含C ++而不是C。 - Ad N
1
这实际上太过于限制,除非你从源代码开始构建整个项目,否则没什么用处。最好只需使用 clang++ 并让它检测您提供给它的文件类型。 当一个项目可以包含 .cpp 文件、.ll 文件(llvm ir)以及第三方库的 .o.a.so 和其他文件时,clang -x c++ 就会变得很混乱。 - user11877195
我也遇到了与@Slav相同的问题。对于一个非常简单的程序,clang++可以工作,但是clang -x c++会显示很多未定义引用错误(其他标志相同)。所以我想最好使用clang++。测试过的clang版本为:11.0.0。 - jdhao

6

解决方案1:

  clang++ your.cpp

解决方案2:

  clang your.cpp -lstdc++

解决方案3:

   clang -x c++ your.cpp

5

我曾经在从源代码构建Clang时遇到类似的问题(但在使用sudo apt-get install时没有出现这种情况。这可能取决于您正在运行的Ubuntu版本)。

值得检查的是clang++是否能找到您的C++库的正确位置:

比较g++ -v <filename.cpp>clang++ -v <filename.cpp>的结果,在“#include < ... > search starts here:”下面。


4

打开终端窗口并导航至您的项目目录。 根据您安装的编译器运行以下命令组合:

使用clang++编译多个C++文件:

$ clang++ *.cpp 
$ ./a.out 

使用g++编译多个C++文件的方法:

$ g++ -c *.cpp 
$ g++ -o temp.exe *.o
$ ./temp.exe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接