如何使用 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++ 程序以避免额外的麻烦。

clang 版本:11.0.0 平台:Ubuntu 16.04

【讨论】:

感谢您实际回答问题。 @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

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

【讨论】:

在使用 #include &lt;iostream&gt; 编译 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 &lt;filename.cpp&gt;clang++ -v &lt;filename.cpp&gt;的结果,在“#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++?的主要内容,如果未能解决你的问题,请参考以下文章

如何 AOT(提前)编译 C++ 程序

使用带有 Clang 的 Boost 编译 c++ 项目时出现问题

如何使用 LLVM 在 Windows 上为 ARM 编译 C++ 程序?

如何在VSCode内编译运行C++

如何使用 clang 格式自动缩进具有 4 个空格的 C++ 类?

如何在VSCode内编译运行C++