pro*_*eek 5 python macos build llvm llvm-py
我试图在Mac OS X上构建llvm-py.
这是我试图做的,我需要下载11vm-2.7,而README文件有这样的评论:确保'--enable-pic'传递给LLVM的'configure'
./configure --prefix=LLVM_DIRECTORY --enable-picpython setup.py build --llvm-config=LLVM_DIRECTORY/bin/llvm-config一切都编译没有错误,但当我试图运行测试文件时,我收到此错误消息.
ImportError: 'dlopen(/Library/Python/2.7/site-packages/llvm/_core.so, 2): Symbol not found: __ZTVN4llvm16ExtractValueInstE\n Referenced from: /Library/Python/2.7/site-packages/llvm/_core.so\n Expected in: flat namespace\n in /Library/Python/2.7/site-packages/llvm/_core.so'
消息错误似乎表示缺少具有平面namemspace问题的函数"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
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试在测试目录中执行示例时,我仍然遇到了不同类型的错误 -
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
Run Code Online (Sandbox Code Playgroud)
这是我跑步时的结果 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)
Run Code Online (Sandbox Code Playgroud)
这就是我让它发挥作用的方法。
export REQUIRES_RTTI=1brew install llvm --enable-shared --with-clang --with-asan --rtti --enable-jitgit clone https://github.com/llvmpy/llvmpy.gitLLVM_CONFIG_PATH=/usr/local/opt/llvm/bin/llvm-config python setup.py installpython -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
Run Code Online (Sandbox Code Playgroud)
我也尝试过kaleidscope,它似乎工作得很好:
$ python kaleidoscope.py
ready> 3+5
Evaluated to: 8.0
ready> 1-34-5
Evaluated to: -38.0
ready>
Run Code Online (Sandbox Code Playgroud)
在/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
Run Code Online (Sandbox Code Playgroud)