首页 > 解决方案 > 如何将 Python 构建为共享动态库?

问题描述

我尝试了很多东西,但我无法让它工作。

我需要将 Python 构建为共享动态库(在 OSX 上)。因此,当我otool -L在任何组件上运行时,我需要查看 dylib 是否已链接。

例如:

$ otool -L $HOME/.pyenv/versions/2.7.11/lib/python2.7/lib-dynload/_ctypes.so
/Users/foo/.pyenv/versions/2.7.11/lib/python2.7/lib-dynload/_ctypes.so:
    /Users/foo/.pyenv/versions/2.7.11/lib/libpython2.7.dylib (compatibility version 2.7.0, current version 2.7.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)

上面的这个例子来自不同的方法(也不是很好)。然而,这展示了(我猜)一个成功链接的 Python 应该是什么样子。

无论我尝试了什么,我的otool -L输出都是这样的:

otool -L _ctypes.so
_ctypes.so:
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.50.4)

我没有看到libpython2.7.dylib正在链接的动态库文件。该文件存在于上面的文件夹中。

这是我的构建命令:

/configure --prefix=/Users/me/apps/python2.7.15-clang-1000.10.44 --enable-shared --enable-unicode=ucs2 CFLAGS="-arch x86_64" LDFLAGS="-arch x86_64"

我想,因为我正在构建到自定义位置,链接器无法找到动态库文件。

我尝试了很多东西,调整$DYLD_LIBRARY_PATH,传递各种LD_标志,但到目前为止没有成功。

更新

所以我在另一台计算机上尝试了这个,一台具有共享动态 Python 的 Linux 机器,我可以确认python二进制文件和.so文件都有指向该libpython2.7文件的链接。

ldd /usr/lib64/python2.7/lib-dynload/_ctypes.so
    linux-vdso.so.1 =>  (0x00007ffd4a5dd000)
    libffi.so.6 => /lib64/libffi.so.6 (0x00007f443bf1e000)
    libpython2.7.so.1.0 => /lib64/libpython2.7.so.1.0 (0x00007f443bb52000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f443b935000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f443b572000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f443b36e000)
    libutil.so.1 => /lib64/libutil.so.1 (0x00007f443b16a000)
    libm.so.6 => /lib64/libm.so.6 (0x00007f443ae68000)
    /lib64/ld-linux-x86-64.so.2 (0x0000558a69696000)

实际的pythonbin 如下所示:

ldd /usr/bin/python
    linux-vdso.so.1 =>  (0x00007fff1850f000)
    libpython2.7.so.1.0 => /lib64/libpython2.7.so.1.0 (0x00007f839c1a5000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f839bf89000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f839bd84000)
    libutil.so.1 => /lib64/libutil.so.1 (0x00007f839bb81000)
    libm.so.6 => /lib64/libm.so.6 (0x00007f839b87f000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f839b4bb000)
    /lib64/ld-linux-x86-64.so.2 (0x0000556816d12000)

所以现在我绝对确定我错过了一些东西。

标签: pythoncompilationshared-librariesdynamic-linking

解决方案


推荐阅读