【问题标题】:Dynamic Library causes error when added to setup.py file (on Mac OS.X)动态库添加到 setup.py 文件时会导致错误(在 Mac OS.X 上)
【发布时间】:2013-08-26 17:46:51
【问题描述】:

我有一个动态库,内置在 cpp 中,实际上可以在 cpp 中运行,但是当我尝试从 python 类中导入它时会引起很多头痛。当我将库添加到我的 setup.py 文件时,就会出现错误。错误:

MacBook-Pro-de-Marcelo-Salloum:python_cpp_interface marcelosalloum$ python userect.py 
Traceback (most recent call last):
  File "userect.py", line 2, in <module>
    from rectangle import Rectangle
ImportError: dlopen(/Users/marcelosalloum/Projects/CppOpenCV/python_cpp_interface/rectangle.so, 2): Symbol not found: __XEatDataWords
  Referenced from: /opt/local/lib/libXext.6.dylib
  Expected in: /opt/local/lib/libX11.6.dylib
 in /opt/local/lib/libXext.6.dylib

Setup.py:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

setup(
    name = 'DyCppInterface',
    version = '1.0',
    author = 'Marcelo Salloum dos Santos',
    # The ext modules interface the cpp code with the python one:
    ext_modules=[
        Extension("rectangle",
            sources=["rectangle.pyx", "cpp_rect.cpp"], # Note, you can link against a c++ library instead of including the source
            include_dirs=[".","source", "/opt/local/include/opencv", "/opt/local/include"],
            language="c++",
            # extra_link_args = ['-arch x86_64'],
            # extra_link_args = ['-arch i386', '-arch x86_64'],
            library_dirs=['/usr/local/lib', 'source'],
            runtime_library_dirs=['/Users/marcelosalloum/Projects/CppOpenCV/python_cpp_interface/source'],
            libraries=['LibCppOpenCV'])
    ],
    cmdclass = {'build_ext': build_ext},
)

已知此 *.so 文件使用 c++ OpenCV 库。在将此库添加到我的共享库之前,一切正常。

  • 如何找出导致错误的原因?
  • 我应该尝试使用静态库而不是动态库吗?
  • P.S.:我的 DYLD_LIBRARY_PATH = ~/Projects/CppOpenCV/python_cpp_interface/source/:/usr/local/mysql/lib/

【问题讨论】:

  • 问题似乎与您的代码无关,而与您的 X11 安装有关。您的 MacPorts libXext 正在从 libX11 中寻找符号 __XEatDataWords,但它不存在。您可能通过间接调用调用该函数的代码来“出错”,但实际上,错误是(a)您的 MacPorts libXext 与您的 MacPorts libX11 不匹配,或者(b)您的 MacPorts @987654328 @ 链接到不同的(例如 Apple)libX11
  • 切换到静态库理论上可以隐藏问题(如果您实际上没有引用错误函数,它可能会完全脱离静态链接),但实际上,您需要修复任何问题你的设置有问题。
  • 最后,我认为这根本与 C++ 无关。您可以很容易地进行测试:围绕 C++ 库编写和编译一个简单的 C 包装器,然后在 Cython 中包装该 C 包装器,如果仍然存在问题,则不是 Cython 和 C++。

标签: c++ python opencv cython distutils


【解决方案1】:

感谢 abarnert 的 cmets,我解决了更新和升级 MacPorts 的问题。正如 abarnert 所观察到的,/opt/local/lib/libXext.6.dylib/opt/local/lib/libX11.6.dylib 之间存在链接问题。

所以我做到了:

$ sudo port selfupdate
$ sudo port upgrade outdated

【讨论】:

    猜你喜欢
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    相关资源
    最近更新 更多