代码之家  ›  专栏  ›  技术社区  ›  mbilyanov

如何将python构建为一个共享的动态库?

  •  0
  • mbilyanov  · 技术社区  · 6 年前

    我试了很多东西,但没能成功。

    我需要将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应该是什么样子。

    不管我做了什么,我的 耳蜗-L 输出如下:

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

    我看不到动态lib文件 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_ 旗帜,迄今为止没有成功。

    请帮帮我,这让我很生气:(

    ---更新---

    所以我在另一台计算机上尝试了这个,一台Linux机器,它有一个共享的动态Python,我可以确认 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)
    

    以及实际的 蟒蛇 bin如下:

    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)
    

    所以现在我绝对肯定我漏掉了什么。

    0 回复  |  直到 6 年前