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

5 投票
2 回答
2598 浏览
提问于 2025-04-17 11:55

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

我做了以下步骤,首先需要下载11vm-2.7,README文件里提到要确保在LLVM的'configure'中加上'--enable-pic'这个选项。

  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): 找不到符号: __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 个回答

4

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

1

这是我让它工作的步骤。

  1. 用brew安装llvm
    • export REQUIRES_RTTI=1(这条命令是为了设置一个环境变量)
    • brew install llvm --enable-shared --with-clang --with-asan --rtti --enable-jit(这条命令是用来安装llvm的,带上了一些选项)
    • 你可以选择不加 --enable-jit 或 --with-clang 这两个选项
  2. 下载llvm-py
    • git clone https://github.com/llvmpy/llvmpy.git(这条命令是从网上下载llvm-py的代码)
  3. 构建llvm-py
    • LLVM_CONFIG_PATH=/usr/local/opt/llvm/bin/llvm-config python setup.py install(这条命令是用来安装llvm-py的)
    • 你可能需要检查一下,这条命令是否需要管理员权限
  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

撰写回答