在Mac OS X上构建和运行llvm-py
我在Mac OS X上尝试构建llvm-py。
我做了以下步骤,首先需要下载11vm-2.7,README文件里提到要确保在LLVM的'configure'中加上'--enable-pic'这个选项。
- 下载llvm 2.7。
- 构建llvm 2.7:运行
./configure --prefix=LLVM_DIRECTORY --enable-pic
- 下载llvm-py 0.6。
- 构建llvm-py 0.6:运行
python setup.py build --llvm-config=LLVM_DIRECTORY/bin/llvm-config
所有的代码都编译得没有错误,但当我尝试运行测试文件时,出现了这个错误信息。
ImportError: 'dlopen(/Library/Python/2.7/site-packages/llvm/_core.so, 2): 找不到符号: __ZTVN4llvm16ExtractValueInstE\n 引用自: /Library/Python/2.7/site-packages/llvm/_core.so\n 期望在: flat namespace\n 在 /Library/Python/2.7/site-packages/llvm/_core.so'
这个错误信息似乎在说缺少一个名为"llvmExtractValueInst"的函数,并且有平面命名空间的问题。这是怎么回事呢?
在llvm 2.7中,Makefile.rules里有这么一行
SharedLinkOptions=-Wl,-flat_namespace -Wl,-undefined -Wl,suppress \
-dynamiclib
我尝试去掉flat_namespace
,但结果出现了编译错误。
补充
根据locojay的回答,我成功构建了brew和llvmpy。
export REQUIRES_RTTI=1
brew install llvm --rtti
sudo pip install git+https://github.com/llvmpy/llvmpy
不过,当我尝试执行测试目录中的示例时,仍然遇到了不同类型的错误-
test> python example.py
Traceback (most recent call last):
File "example.py", line 4, in <module>
from llvm import *
File "/Library/Python/2.7/site-packages/llvm/__init__.py", line 11, in <module>
from llvm import _core
ImportError: dlopen(/Library/Python/2.7/site-packages/llvm/_core.so, 2): Symbol not found: __ZN4llvm10DataLayout2IDE
Referenced from: /Library/Python/2.7/site-packages/llvm/_core.so
Expected in: flat namespace
in /Library/Python/2.7/site-packages/llvm/_core.so
这是我运行otool -L /Library/Python/2.7/site-packages/llvm/_core.so
时的结果
/Library/Python/2.7/site-packages/llvm/_core.so:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)
2 个回答
看看llvmpy的文档
对于LLVM 3.2,确保在运行make的时候,环境变量REQUIRES_RTTI=1已经定义。否则,你可能会看到“未定义的符号:_ZTIN4llvm24PassRegistrationListenerE”。详细信息请参考http://llvm.org/docs/Packaging.html#c-features。
所以对我来说,这个方法有效
export REQUIRES_RTTI=1
brew install llvm --rtti
pip install git+https://github.com/llvmpy/llvmpy
我想在最坏的情况下,可以试试anaconda……
这是我让它工作的步骤。
- 用brew安装llvm
export REQUIRES_RTTI=1
(这条命令是为了设置一个环境变量)brew install llvm --enable-shared --with-clang --with-asan --rtti --enable-jit
(这条命令是用来安装llvm的,带上了一些选项)- 你可以选择不加 --enable-jit 或 --with-clang 这两个选项
- 下载llvm-py
git clone https://github.com/llvmpy/llvmpy.git
(这条命令是从网上下载llvm-py的代码)
- 构建llvm-py
LLVM_CONFIG_PATH=/usr/local/opt/llvm/bin/llvm-config python setup.py install
(这条命令是用来安装llvm-py的)- 你可能需要检查一下,这条命令是否需要管理员权限
- 测试
python -c 'import llvm; llvm.test()'
(这条命令是用来测试是否安装成功的)
在OS X Mavericks系统下,llvm 3.3版本可以正常工作。
test_scalar_type (llvm.tests.test_type_hash.TestTypeHash) ... ok
test_struct_type (llvm.tests.test_type_hash.TestTypeHash) ... ok
test_uses (llvm.tests.test_uses.TestUses) ... ok
test_volatile (llvm.tests.test_volatile.TestVolatile) ... ok
test_volatile_another (llvm.tests.test_volatile.TestVolatile) ... ok
----------------------------------------------------------------------
Ran 75 tests in 0.249s
OK (skipped=4)
-------------------------------run isolated tests-------------------------------
testing llvm.tests.test_intel_native_asm
.
----------------------------------------------------------------------
Ran 1 test in 0.008s
OK
我还尝试了kaleidoscope,看起来也能正常运行:
$ python kaleidoscope.py
ready> 3+5
Evaluated to: 8.0
ready> 1-34-5
Evaluated to: -38.0
ready>
在/Library/Python/2.7/site-packages/llvmpy/capsule.py
的第114行做了一处修改。我不确定这个修改是否有害,但在做了这个改动后可以正常工作。
def release_ownership(old):
logger.debug('Release %s', old)
addr = getPointer(old)
name = getName(old)
if _addr2dtor.get((name, addr)) is None:
clsname = getClassName(old)
if not _pyclasses[clsname]._has_dtor():
return
# Guard duplicated release <-- raises an error
return
raise Exception("Already released")
_addr2dtor[(name, addr)] = None