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

时间:2010-01-24 22:54:45

标签: 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的冗余 - 标准配置,make例程在MinGW中正常工作,没有任何黑客或解决方法。

1 个答案:

答案 0 :(得分:12)

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

我现在可以使用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&lt; string&gt;”之后line,insert ...

#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中删除以下文件 - 是的,我知道我之前说他们不在那里,但是我的文件夹布局混乱... < / p>

  • 的mingw32 \包括\ pthread.h
  • 的mingw32 \包括\ sched.h中
  • 的mingw32 \包括\ semaphore.h中
  • 的mingw32 \ lib中\的libpthreads.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-全4.4.0-的mingw32彬2.tar.lzma
  • 使-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
  • 野牛-2.4.1-1-MSYS-1.0.11-bin.tar.lzma
  • 柔性2.5.35-1-MSYS-1.0.11-bin.tar.lzma
  • libregex-0.12-1-MSYS-1.0.11-DLL-0.tar.lzma

这个包列表可能超过了需要 - 特别是只有deckGNU测试才需要tcl tk,我还没有这个测试。

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

提取llvm-2.6.tar.gz

编辑文件C:\ llvm-2.6 \ lib \ ExecutionEngine \ Interpreter \ ExternalFunctions.cpp,在“#include&lt; string&gt;”行之后,添加行

#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配置脚本选项。