繁体   English   中英

在Mac OS X上构建并运行llvm-py

[英]Building and running llvm-py on Mac OS X

我试图在Mac OS X上构建llvm-py

这是我尝试做的事情,我需要下载11vm-2.7,并且README文件具有以下注释:确保将'--enable-pic'传递给LLVM的'configure'

  1. 下载llvm 2.7
  2. 构建llvm 2.7:运行./configure --prefix=LLVM_DIRECTORY --enable-pic
  3. 下载llvm-py 0.6
  4. 构建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): 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'

消息错误似乎表明缺少缺少函数“ 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目录中执行示例时,仍然出现另一种错误-

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)

看看llvmpy的@ docs

对于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

我猜一个人在最坏的情况下总可以尝试一下蟒蛇...

这就是我的工作方式。

  1. 用brew安装llvm
    • export REQUIRES_RTTI=1
    • brew install llvm --enable-shared --with-clang --with-asan --rtti --enable-jit
    • 您可以跳过--enable-jit或--with-clang
  2. 下载llvm-py
    • git clone https://github.com/llvmpy/llvmpy.git
  3. 编译llvm-py
    • LLVM_CONFIG_PATH=/usr/local/opt/llvm/bin/llvm-config python setup.py install
    • 您可能需要检查此命令是否不需要root用户访问权限
  4. 测试
    • 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

我也尝试过万花筒 ,它似乎工作正常:

$ 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM