5

我试图在 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> 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)
4

2 回答 2

4

看看 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

我想在最坏的情况下总是可以尝试一下anaconda....

于 2013-01-05T05:17:00.850 回答
1

这就是我让它工作的方式。

  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

我也试过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
于 2014-01-15T19:20:23.753 回答