相关疑难解决方法(0)

包含和分发带有 Python C 扩展的第三方库

我正在构建一个使用“第三方”库的 C Python 扩展——在本例中,我使用单独的构建过程和工具链构建了一个。调用这个库libplumbus.dylib

目录结构为:

grumbo/
  include/
    plumbus.h
  lib/
    libplumbus.so
  grumbo.c
  setup.py
Run Code Online (Sandbox Code Playgroud)

我的setup.py样子大约是:

from setuptools import Extension, setup

native_module = Extension(
    'grumbo',
    define_macros = [('MAJOR_VERSION', '1'),
                     ('MINOR_VERSION', '0')],
    sources       = ['grumbo.c'],
    include_dirs  = ['include'],
    libraries     = ['plumbus'],
    library_dirs  = ['lib'])


setup(
    name = 'grumbo',
    version = '1.0',
    ext_modules = [native_module] )
Run Code Online (Sandbox Code Playgroud)

由于 libplumbus 是一个外部库,当我运行时,import grumbo我得到:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dlopen(/path/to/grumbo/grumbo.cpython-37m-darwin.so, 2): Library not loaded: lib/libplumbus.dylib
  Referenced …
Run Code Online (Sandbox Code Playgroud)

c python setuptools python-c-api python-extensions

3
推荐指数
1
解决办法
717
查看次数

Cython未定义符号,带C包装器

我试图将C代码公开给cython,并尝试使用另一个cython模块中的c文件中定义的函数时遇到“未定义符号”错误。
我的h文件中定义的函数以及使用手动包装的函数都可以正常工作。

基本上与这个问题相同,但是解决方案(针对库的链接)对我来说并不令人满意。
我认为我在setup.py脚本中缺少什么?


我的案例的最小示例:

foo.h

int source_func(void);

inline int header_func(void){
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

foo.c

#include "foo.h"

int source_func(void){
    return 2;
}
Run Code Online (Sandbox Code Playgroud)


foo_wrapper.pxd

cdef extern from "foo.h":
    int source_func()
    int header_func()

cdef source_func_wrapper()
Run Code Online (Sandbox Code Playgroud)

foo_wrapper.pyx

cdef source_func_wrapper():
    return source_func()
Run Code Online (Sandbox Code Playgroud)


我想在以下功能中使用cython模块:
test_lib.pyx

cimport foo_wrapper

def do_it():
    print "header func"
    print foo_wrapper.header_func() # ok
    print "source func wrapped"
    print foo_wrapper.source_func_wrapper() # ok    
    print "source func"
    print foo_wrapper.source_func() # undefined symbol: source_func
Run Code Online (Sandbox Code Playgroud)


setup.py同时构建foo_wrappertest_lib

cdef extern from …
Run Code Online (Sandbox Code Playgroud)

cython

1
推荐指数
1
解决办法
920
查看次数

标签 统计

c ×1

cython ×1

python ×1

python-c-api ×1

python-extensions ×1

setuptools ×1