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

Ste*_*314 15 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中工作正常,没有任何黑客或变通方法.

Ste*_*314 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
Run Code Online (Sandbox Code Playgroud)

解决方法是使用"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
Run Code Online (Sandbox Code Playgroud)

似乎正在指定一个禁用内置"alloca"的选项.

解决方法是编辑问题文件

C:\llvm-2.6\lib\ExecutionEngine\Interpreter\ExternalFunctions.cpp
Run Code Online (Sandbox Code Playgroud)

在"#include <string>"行之后,插入...

#define alloca __builtin_alloca
Run Code Online (Sandbox Code Playgroud)


问题3 ......

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

Assertion failed: errorcode == 0, file RWMutex.cpp, line 87
Run Code Online (Sandbox Code Playgroud)

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

86:   // Initialize the rwlock
87:   errorcode = pthread_rwlock_init(rwlock, &attr);
88:   assert(errorcode == 0);
Run Code Online (Sandbox Code Playgroud)

基本问题是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的\包括\ pthread.h
  • mingw32的\包括\ sched.h中
  • mingw32的\包括\ semaphore.h中
  • mingw32的\ LIB \的libpthreads.a

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

./configure --disable-threads
Run Code Online (Sandbox Code Playgroud)


那么,步骤是......

首先,安装以下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
  • 庆典-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 <string>"行后面添加行

#define alloca __builtin_alloca
Run Code Online (Sandbox Code Playgroud)

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

cd /c/llvm-2.6
./configure --disable-threads
make -k CXXFLAGS=-fexceptions
Run Code Online (Sandbox Code Playgroud)

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

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

请考虑--enable-targets = host-only和--enable-doxygen配置脚本选项.

  • 很棒的答案!. (2认同)