c++ - 如何在 Windows 上使用 GCC 4 构建 LLVM?

标签 c++ mingw llvm

我已经能够使用 MinGW GCC 3.4.5 构建 LLVM 2.6(llvm-2.6.tar.gz 包)。我没有正确测试,但它似乎可以工作。

问题是,我有自己的库,它们不使用 GCC3 构建,但在 GCC4 中可以正常工作(模板问题)。我相信 MinGW 的第一个官方 GCC4 版本是 GCC 4.4.0。

编辑

整洁 - “试过这个试过那个”信息中的所有有用信息现在都在答案中。

编辑

这个问题/答案的大部分对于 LLVM 2.7 来说都是多余的 - 标准配置,使例程在 MinGW 中正常工作,没有任何黑客或变通方法。

最佳答案

如果一开始你没有成功...

我现在可以使用 MinGW GCC 4.4.0 构建 LLVM 2.6,一旦您知道如何操作,这并不难。我仍然无法运行 DejaGNU 测试,尽管乍一看这不应该那么难——很可能我需要用于 dejagnu 和期望的 CygWin 包。我还没有构建llvm-gcc。

在一步一步之前,这里有三个问题......


问题1...

尝试使用标准构建指令构建 llvm 失败,并显示 Signals.cpp (win32/Program.inc) 中出现编译器错误

llvm[1]: Compiling Signals.cpp for Release build
In file included from Signals.cpp:33:
Win32/Signals.inc: In function 'LONG LLVMUnhandledExceptionFilter(_EXCEPTION_POINTERS*)':
Win32/Signals.inc:234: error: exception handling disabled, use -fexceptions to enable

解决方法是使用“make -k -fexceptions”——在纯语言文档中找到的答案。


问题2...

即使使用第一种解决方法,也会出现以下编译器错误...

ExternalFunctions.cpp: In function 'bool ffiInvoke(void (*)(), llvm::Function*, const std::vector<llvm::GenericValue, std::allocator<llvm::GenericValue> >&, const llvm::TargetData*, llvm::GenericValue&)':
ExternalFunctions.cpp:207: error: 'alloca' was not declared in this scope

似乎正在指定一个禁用“alloca”内置选项的选项。

解决方法是编辑问题文件

C:\llvm-2.6\lib\ExecutionEngine\Interpreter\ExternalFunctions.cpp

就在“#include ”行之后,插入...

#define alloca __builtin_alloca


问题3...

即使修复了编译错误,示例程序也不会运行。运行时错误是...

Assertion failed: errorcode == 0, file RWMutex.cpp, line 87

这与 pthreads 库的使用有关,在以下几行中 RWMutex.cpp

86:   // Initialize the rwlock
87:   errorcode = pthread_rwlock_init(rwlock, &attr);
88:   assert(errorcode == 0);

基本问题是 pthreads 支持包含在 MinGW GCC 中,并且包含在 AFAICT 所有 GCC4 变体的构建中 - 包括非官方 TDM 构建,以及包括 MinGW GCC 4.4.0。这包含在 MinGW GCC 3.4.5 中,这就是 LLVM 在该编译器上使用默认选项构建良好的原因。使用 4.4.0,LLVM 配置脚本检测到 pthreads 支持并使用它 - 但使用的 pthreads-w32 库似乎不完全兼容。

一种解决方法是按照 http://markmail.org/message/d7zw2zjq7svevsci 中的建议从 mingw gcc 4.4.0 中删除以下文件。 - 是的,我知道我之前说过他们不在那里,但我的文件夹布局很困惑......

  • mingw32\include\pthread.h
  • mingw32\include\sched.h
  • mingw32\include\semaphore.h
  • mingw32\lib\libpthread.a

不过,最好简单地告诉配置脚本禁用线程...

./configure --disable-threads


所以,步骤是……

首先,安装以下 MinGW 和 MSYS 包...

  • binutils-2.20-1-mingw32-bin.tar.gz
  • mingwrt-3.17-mingw32-dev.tar.gz
  • mingwrt-3.17-mingw32-dl​​l.tar.gz
  • w32api-3.14-mingw32-dev.tar.gz
  • gcc-full-4.4.0-mingw32-bin-2.tar.lzma
  • make-3.81-20090914-mingw32-bin.tar.gz
  • tcltk-8.4.1-1.exe
  • MSYS-1.0.11.exe
  • msysDTK-1.0.1.exe
  • bash-3.1.17-2-msys-1.0.11-bin.tar.lzma
  • bison-2.4.1-1-msys-1.0.11-bin.tar.lzma
  • flex-2.5.35-1-msys-1.0.11-bin.tar.lzma
  • libregex-0.12-1-msys-1.0.11-dll-0.tar.lzma

这个包列表可能比需要的多 - 特别是 tcl tk 仅用于 DejaGNU 测试,我还没有开始工作。

确保 MinGW 安装的\bin 文件夹位于 PATH(控制面板、系统、高级、环境变量)上。

解压llvm-2.6.tar.gz

编辑文件 C:\llvm-2.6\lib\ExecutionEngine\Interpreter\ExternalFunctions.cpp,并在“#include ”行之后添加该行

#define alloca __builtin_alloca

启动 MSYS 命令提示符,然后运行...

cd /c/llvm-2.6
./configure --disable-threads
make -k CXXFLAGS=-fexceptions

我假设您将 llvm 解压缩到 c:\llvm-2.6

方便的提示 - 尝试“./configure --help”

特别考虑 --enable-targets=host-only 和 --enable-doxygen 配置脚本选项。

关于c++ - 如何在 Windows 上使用 GCC 4 构建 LLVM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2129263/

相关文章:

c++ - 全局替换所有新运营商

java - 如何修复JNI项目无法运行的问题

c++ - C++构造函数中点<函数名>的含义

c - LLVM 提示汇编器错误 "Unexpected token in memory operand"

c++ - 我的轨迹栏有什么问题?

c++ - C++中new和delete的使用

c++ - 数组越界元素的值——它应该在每次执行时改变还是保持不变?

c - 将结构写入二进制文件,然后读取文件并打印数据。

c++ - 从 python IDLE 问题调用 c++

c++ - 检查一个节点是否在有向图的节点的路径中