c++ - 在 Mingw 64 位上使用 Clang

标签 c++ gcc mingw clang qmake

除了 GCC 之外,我还希望在 Windows 7 上的 MinGW-64bit 环境中使用 clang,两者都使用来自 gcc 的标准库。我正在使用 http://sourceforge.net/projects/mingwbuilds/ 中的 gcc_x64_4.8.1_win32_seh_rev1 和 Qt .

我在这个环境中构建了 clang 3.3,没有任何标志(只是解决了 HAVE_EHTABLE_SUPPORT 编译问题)。

我使用 qmake 构建过程,项目文件还有这些用于 clang 的行(仅 Release模式):

QMAKE_CC = clang
QMAKE_CXX = clang++
QMAKE_CXXFLAGS_RELEASE += -Wno-ignored-attributes
QMAKE_CXXFLAGS_RELEASE += -I"C:/tc/gcc_x64_4.8.1_win32_seh_rev1/mingw64/lib/gcc/x86_64-w64-mingw32/4.8.1"
QMAKE_CXXFLAGS_RELEASE += -I"C:/tc/gcc_x64_4.8.1_win32_seh_rev1/mingw64/lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++"
QMAKE_CXXFLAGS_RELEASE += -I"C:/tc/gcc_x64_4.8.1_win32_seh_rev1/mingw64/lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++/x86_64-w64-mingw32"
QMAKE_CXXFLAGS_RELEASE += -I"C:/tc/gcc_x64_4.8.1_win32_seh_rev1/mingw64/x86_64-w64-mingw32/include"

编译到:

C:/tc/gcc_x64_4.8.1_win32_seh_rev1/mingw64/lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++\bits/random.h:106:26: error:
      __int128 is not supported on this target
      { typedef unsigned __int128 type; };
                         ^

搜索互联网给出了_mingw.h的引用,但我不知道那里有什么问题:

#if (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 1)) && \
    !defined(__SIZEOF_INT128__) /* clang >= 3.1 has __int128 but no size macro */
#define __SIZEOF_INT128__ 16
#endif

最佳答案

查看此链接:https://web.archive.org/web/20140301212210/http://www.bencode.net/blog/2012/10/20/clangonwindows/

这是一个关于在 Windows 8 和 MinGW 上运行功能 Clang++ 构建的安装步骤教程。 Windows 8 和 Windows 7 有很多共同点,本教程可用于完成您的任务。

================================================ ===

步骤 1

安装 MinGW。使用 mingw-get-inst-20120426.exe 与预打包的存储库目录一起使用,该目录捆绑在 GCC 4.6.1 中,而不是 4.7.x,在撰写本文时 Clang 不支持无缝。您将需要 C Compiler、C++ Compiler、MSYS Basic System 和 MinGW Developer Toolkit MinGW 软件包。

第二步

Python 2.x。将 Python 解释器和库安装到 c:\MinGW\bin。

第三步

安装 Subversion。我选择了 CollabNet 的 Subversion 1.7.7(Windows 64 位)包。

结帐 LLVM:

cd C:\mingw\msys\1.0 mkdir 源代码 光盘源 svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm

结帐 clang :

cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
cd ../..

结帐编译器-RT:

cd llvm/projects
svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
cd ../..

第四步

C++ 头文件和库。 Clang 将尝试自动探测 MinGW 的目录结构以获取支持的 libstdc++ 路径集。对于 32 位 i686-w64-mingw32 和 64 位 x86_64-w64-mingw32,Clang 假设如下:

  • some_directory/bin/gcc.exe
  • some_directory/bin/clang.exe
  • some_directory/bin/clang++.exe
  • some_directory/bin/../include/c++/GCC_version
  • some_directory/bin/../include/c++/GCC_version/x86_64-w64-mingw32
  • some_directory/bin/../include/c++/GCC_version/i686-w64-mingw32
  • some_directory/bin/../include/c++/GCC_version/backward
  • some_directory/bin/../x86_64-w64-mingw32/include
  • some_directory/bin/../i686-w64-mingw32/include
  • some_directory/bin/../include

可以在此处的 InitHeaderSearch.cpp 中找到此探测逻辑(撰写本文时的第 374 行):

  • C:\mingw\msys\1.0\src\llvm\tools\clang\lib\Frontend\InitHeaderSearch.cpp

通过查看此处 C:\mingw\lib\gcc\mingw32\4.6.2,确保您的 MinGW 安装程序使用的 gcc 版本与受支持的版本匹配(例如 4.6.2 是我的情况)。

如果您的 gcc 版本似乎没有被自动支持,Clang 将可用于解析标准库和头文件——您想要这个。一些帮助 Clang 找到这些的流行方法(如果还没有的话):

  • 指定 --with-gcc-toolchain 配置选项(在构建之前)以告诉 Clang 包含所需 libstdc++ 的 gcc 的安装位置。
  • 创建一个符号链接(symbolic link),例如如果您有 4.7.2,并且自动探测逻辑中只有 4.7.0,请创建一个 4.7.0 到 4.7.2 的符号链接(symbolic link)。
  • 在构建 Clang 之前将 InitHeaderSearch.cpp 修改为您的特定环境。

第 5 步

构建。使用 MinGW 外壳。这要归功于 Pete。

cd /src
mkdir build
cd build
export CC=gcc
export CXX=g++
../llvm/configure --disable-docs --enable-optimized --enable-targets=x86,x86_64 --prefix=/mingw
make
make install

原创作品的功劳: Posted by Ben Simmonds Oct 20th, 2012

关于c++ - 在 Mingw 64 位上使用 Clang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17390044/

相关文章:

c++ - Eclipse CDT 使用主项目编译器设置编译静态库

c++ - 在 ‘)’ token G++ 之前预期为 ‘;’

在 MinGW 下取消 pthread_cond_wait 中的线程会导致访问冲突

c++ - Boost::ptree 解析器无法从 xml 文件中读取容器

c - 为内联汇编创建常量池的正确方法是什么?

c++ - 静态库中的符号有时会链接到可执行文件中,有时不会

c++ - 无法让 CMAKE 编译项目

c++ - gnu gcc 编译器头文件中缺少一些东西吗? (commctrl.h)

c++ - 如何排除在 Eclipse (C++) 中构建的源文件?

c++ - 使用 termios api (c++) 在 Linux 中检测字符设备是否已断开连接