Python scipy&x2B;(基于numpy.distutils)setup.py+;ctypes:未定义的符号 简介

Python scipy&x2B;(基于numpy.distutils)setup.py+;ctypes:未定义的符号 简介,python,c++,numpy,scipy,shared-libraries,Python,C++,Numpy,Scipy,Shared Libraries,作为我先前问题的后续行动,我仍然试图: 向scipy的一个模块添加新功能(例如,scipy.optimize) 基于C++的代码 它定义了要调用的接口函数 通过scipy/optimize中的setup.py自动设置 代码合并 为了保持简单,假设我们得到了以下(愚蠢且)简单的C++代码: extern "C" void hallo() { int a = 0; } 在这里,我们使用extern关键字来处理名称损坏 我们在scipy.optimize中引入了新的文件和文件夹: s

作为我先前问题的后续行动,我仍然试图:

  • 向scipy的一个模块添加新功能(例如,
    scipy.optimize
  • 基于C++的代码
    • 它定义了要调用的接口函数
  • 通过
    scipy/optimize
    中的
    setup.py
    自动设置
代码合并 为了保持简单,假设我们得到了以下(愚蠢且)简单的C++代码:

extern "C" void hallo()
{
    int a = 0;
}
在这里,我们使用
extern
关键字来处理名称损坏

我们在
scipy.optimize中引入了新的文件和文件夹:

scipy/optimize/__init__py
scipy/optimize/lbfgsb/...
scipy/optimize/lbfgsb.py
...
scipy/optimize/_mylib/README.md       # new
scipy/optimize/_mylib/LICENSE         # new
scipy/optimize/_mylib/src/debug.cpp   # new
scipy/optimize/mylib.py               # new
设置准备 我们在
scipy/optimize/setup.py
中准备模块设置:

from __future__ import division, print_function, absolute_import

from os.path import join

from scipy._build_utils import numpy_nodepr_api

def configuration(parent_package='',top_path=None):
    from numpy.distutils.misc_util import Configuration
    from numpy.distutils.system_info import get_info
    config = Configuration('optimize',parent_package, top_path)

    # MODIFICATION START
    # OTHER EXTENSIONS OMITTED 
    # INSPIRED BY scipy.spatial: ckdtree/src & setup.py

    mylib_src = ['debug.cpp']
    mylib_src = [join('_mylib', 'src', x) for x in mylib_src]

    mylib_headers = []
    mylib_headers = [join('_mylib', 'src', x) for x in mylib_headers]

    mylib_dep = mylib_headers + mylib_src

    config.add_extension('_mylib',
                         sources=mylib_src,
                         depends=mylib_dep,
                         include_dirs=[join('_mylib', 'src')])
    # MODIFICATION END    

    return config

if __name__ == '__main__':
    from numpy.distutils.core import setup
    setup(**configuration(top_path='').todict())
运行scipy安装 使用以下各项立即安装scipy(从基本目录):

我们将在
scipy/optimize/
中看到这些共享库:

_lbfgsb.cpython-35m-x86_64-linux-gnu.so
...
_mylib.cpython-35m-x86_64-linux-gnu.so
让我们尝试使用它/查看scipy/optimize/mylib.py 如另一幅图所示,我们可以使用(我们在
scipy/optimize/mylib.py
)获取lib,并获取我们想要使用的函数:

import scipy as scp
import numpy.ctypeslib as ctl
lib = ctl.load_library('_mylib', scp.optimize.__file__)
myfunc = lib.hallo
现在问题来了:此操作失败,原因是:

AttributeError: /.../_mylib.cpython-35m-x86_64-linux-gnu.so: undefined symbol: hallo
每只手试一试:

import ctypes
lib = ctypes.CDLL('full path to above so')
myfun = lib.hallo
也失败了

但是,检查(在我的linux操作系统上):
nm——仅定义了_mylib.cpython-35m-x86_64-linux-gnu。因此
输出:

...
...
0000000000000530 t hallo
...
应该没问题。(免责声明:我绝对不知道有关C++链接的任何知识)。strong>编辑:可能不好。参见下文关于
t与t
的观察

手动操作:这很有效 转到scipy/optimize/_mylib/src

g++ -shared -fPIC debug.cpp -o mylib.so
紧随其后的是
nm——仅定义了mylib。因此
显示了相同的函数,但一些
t
变成了
t

...
...
0000000000000600 T hallo
...
也许这就是原因,还有一些相关的一般性问题

如前所述,这项工作:

# in src
import numpy.ctypeslib as ctl
lib = ctl.load_library('mylib.so', '.')
lib.hallo
# < FuncPtr object at 0x....
# in src
import numpy.ctypeslib as ctl
lib = ctl.load_library('mylib.so', '.')
lib.hallo
# < FuncPtr object at 0x....
building 'scipy.optimize._mylib' extension
compiling C++ sources
C compiler: x86_64-linux-gnu-g++ -pthread -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC

creating build/temp.linux-x86_64-3.5/scipy/optimize/_mylib
creating build/temp.linux-x86_64-3.5/scipy/optimize/_mylib/src
compile options: '-Iscipy/optimize/_mylib/src -I/usr/local/lib/python3.5/dist-packages/numpy-1.15.0.dev0+e4d678a-py3.5-linux-x86_64.egg/numpy/core/include -I/usr/include/python3.5m -c'
x86_64-linux-gnu-g++: scipy/optimize/_mylib/src/debug.cpp
scipy/optimize/_mylib/src/debug.cpp: In function ‘void hallo()’:
scipy/optimize/_mylib/src/debug.cpp:3:9: warning: unused variable ‘a’ [-Wunused-variable]
     int a = 0;
         ^
x86_64-linux-gnu-g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-3.5/scipy/optimize/_mylib/src/debug.o -Lbuild/temp.linux-x86_64-3.5 -o scipy/optimize/_mylib.cpython-35m-x86_64-linux-gnu.so -Wl,--version-script=build/temp.linux-x86_64-3.5/link-version-scipy.optimize._mylib.map