【问题标题】:How do I compile C++ with Clang?如何使用 Clang 编译 C++?
【发布时间】:2012-02-27 05:48:17
【问题描述】:

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

【问题讨论】:

    标签: c++ clang


    【解决方案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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-26
            • 2021-04-05
            • 2011-12-20
            • 1970-01-01
            • 2012-12-16
            • 2019-12-11
            相关资源
            最近更新 更多