如果一开始你没有成功...
我现在可以使用 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 <string>”行之后,插入...
#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);
基本问题是 MinGW GCC 中包含 pthreads 支持,并且所有 GCC4 变体都包含在 AFAICT 的构建中 - 包括非官方的 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-dll.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
- 野牛-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 <string>" 行之后,添加行
#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 配置脚本选项。