【问题标题】:How to tell what python version libboost_python.so is using?如何判断 libboost_python.so 使用的是什么 python 版本?
【发布时间】:2012-01-26 09:17:21
【问题描述】:

我想知道 python boost_python.so 期望的版本。这是在具有多个 python 版本的计算机上,我自己没有构建/安装 boost(我也没有 root 访问权限)。

我如何知道 python boost_python.so 是为哪个版本编译的?

我在 ldd 的输出中没有发现任何有用的信息,但将其包含在此处以防其他人看到某些内容。

-bash-3.2$ ldd -v libboost_python.so.1.46.1 
libutil.so.1 => /lib64/libutil.so.1 (0x00002ad65582d000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002ad655a30000)
libdl.so.2 => /lib64/libdl.so.2 (0x00002ad655c4b000)
librt.so.1 => /lib64/librt.so.1 (0x00002ad655e50000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00002ad656059000)
libm.so.6 => /lib64/libm.so.6 (0x00002ad656359000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002ad6565dd000)
libc.so.6 => /lib64/libc.so.6 (0x00002ad6567eb000)
/lib64/ld-linux-x86-64.so.2 (0x000000374c600000)

Version information:
./libboost_python.so.1.46.1:
    libgcc_s.so.1 (GCC_3.0) => /lib64/libgcc_s.so.1
    libpthread.so.0 (GLIBC_2.2.5) => /lib64/libpthread.so.0
    libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
    libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
    libstdc++.so.6 (CXXABI_1.3) => /usr/lib64/libstdc++.so.6
    libstdc++.so.6 (GLIBCXX_3.4) => /usr/lib64/libstdc++.so.6
/lib64/libutil.so.1:
    libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
/lib64/libpthread.so.0:
    ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
    ld-linux-x86-64.so.2 (GLIBC_2.2.5) => /lib64/ld-linux-x86-64.so.2
    ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
    libc.so.6 (GLIBC_2.3.2) => /lib64/libc.so.6
    libc.so.6 (GLIBC_PRIVATE) => /lib64/libc.so.6
    libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
/lib64/libdl.so.2:
    ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
    libc.so.6 (GLIBC_PRIVATE) => /lib64/libc.so.6
    libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
/lib64/librt.so.1:
    ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
    libpthread.so.0 (GLIBC_2.2.5) => /lib64/libpthread.so.0
    libpthread.so.0 (GLIBC_PRIVATE) => /lib64/libpthread.so.0
    libc.so.6 (GLIBC_2.3.2) => /lib64/libc.so.6
    libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
    libc.so.6 (GLIBC_PRIVATE) => /lib64/libc.so.6
/usr/lib64/libstdc++.so.6:
    ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
    libgcc_s.so.1 (GCC_4.2.0) => /lib64/libgcc_s.so.1
    libgcc_s.so.1 (GCC_3.3) => /lib64/libgcc_s.so.1
    libgcc_s.so.1 (GCC_3.0) => /lib64/libgcc_s.so.1
    libc.so.6 (GLIBC_2.3.2) => /lib64/libc.so.6
    libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
    libc.so.6 (GLIBC_2.3) => /lib64/libc.so.6
    libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
/lib64/libm.so.6:
    libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
/lib64/libgcc_s.so.1:
    libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
    libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
/lib64/libc.so.6:
    ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
    ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2

【问题讨论】:

    标签: python boost boost-python


    【解决方案1】:

    这是你要找的吗?

    ~/Desktop$ dpkg --list | grep libboost
    ii  libboost-filesystem1.46.1                      1.46.1-5ubuntu2                         filesystem operations (portable paths, iteration over directories, etc) in C++
    ii  libboost-program-options1.46.1                 1.46.1-5ubuntu2                         program options library for C++
    ii  libboost-python-dev                            1.46.1.1                                Boost.Python Library development files (default version)
    ii  libboost-python1.46-dev                        1.46.1-5ubuntu2                         Boost.Python Library development files
    ii  libboost-python1.46.1                          1.46.1-5ubuntu2                         Boost.Python Library
    ii  libboost-regex1.46.1                           1.46.1-5ubuntu2                         regular expression library for C++
    ii  libboost-serialization1.46.1                   1.46.1-5ubuntu2                         serialization library for C++
    ii  libboost-signals1.46.1                         1.46.1-5ubuntu2                         managed signals and slots library for C++
    ii  libboost-system1.46.1                          1.46.1-5ubuntu2                         Operating system (e.g. diagnostics support) library
    ii  libboost-thread1.46.1                          1.46.1-5ubuntu2                         portable C++ multi-threading
    ii  libboost1.46-dev                               1.46.1-5ubuntu2                         Boost C++ Libraries development files
    

    以上内容适用于基于 debian 的发行版。我相信 Fedora 的等价物应该是:

    rpm -qa | grep libboost
    

    HTH!

    【讨论】:

    • 我相信 boost 是从没有安装包管理器的源代码构建的。
    【解决方案2】:

    发件人:https://github.com/mapnik/mapnik/wiki/InstallationTroubleshooting

    “有时即使这样也不起作用。提示:传递 -d2 标志以查看所有由 bjam 发送到 gcc 的编译命令,您可能会在编译参数中看到类似 -I/usr/include/python24 的内容它应该是 -I/usr/include/python26 (或一些旧版本的 python 头文件)。如果发生这种情况,那么您可以制作一个完整的配置文件(包含所有可能的 python 信息)并在 bjam 命令行上传递对它的引用. 相关文档在这里:http://www.boost.org/doc/libs/1_42_0/libs/python/doc/building.html#configuring-boost-build,示例如下:

    创建一个名为“user-config.jam”的文件(但将 python 版本更改为适当的):

    import option ;
    import feature ;
    if ! gcc in [ feature.values <toolset> ]
    {
        using gcc ;
    }
    project : default-build <toolset>gcc ;
    using python
         : 2.5 # version
         : /usr/bin/python2.5 # cmd-or-prefix
         : /usr/include/python2.5/ # includes
         : /usr/lib/python2.5/config/ # a lib actually symlink
         : <toolset>gcc # condition
         ;
    libraries = --with-python ;
    

    "

    查找 .jam 配置文件。如果存在,请检查“使用 python”命令。如果它不存在,请针对 bjam 运行 -d2 标志以确定它使用的 python 的默认位置。这显然不是一种直接的方法,并且在给定输入的情况下只会给你一个可能的答案(但也许这已经足够好了)。

    【讨论】:

    • 这是在集群环境中,我怀疑 boost 是从源代码安装的,但在我无法访问的机器上编译(例如,机器上没有 bjam)。我怀疑我需要一种直接从 boost 库中提取 if 的方法。
    【解决方案3】:

    我意识到 OP 是在询问如何在 Linux 环境中执行此操作,但我在 Windows 环境中遇到了同样的问题,并认为在这里分享可能会有所帮助。

    要查看将自动链接到生成的可执行文件的 Python DLL,请使用 Visual Studio 附带的 dumpbin 实用程序。只需打开 Visual Studio 开发人员命令提示符,然后运行:

    dumpbin /DIRECTIVES libboost_python3-*.lib | findstr DEFAULTLIB:python
    

    这至少会告诉你构建 Boost 时使用的 Python 的主要/次要版本。例如,如果您在构建 Boost 时使用 Python 3.5.2,则此命令将返回一堆带有文本的行:

    /DEFAULTLIB:python35.lib

    【讨论】:

      【解决方案4】:

      有趣的是,在我的 OS X 系统上,otool -L 确实列出了 python 库,但在 linux 系统上,我可以访问它似乎是一个未满足的依赖项,并且没有在 ldd 输出中列出.

      在我的例子中,我知道它是针对 python 2.7 编译的,但是检查 strings /.../libboost_python.so 的输出显示没有提到 2.7,而 27 只出现在与 python 版本无关的损坏符号中。

      因此我得出结论,如果不寻找 API 符号差异,例如 2.6 和 2.7 版本,就无法判断。

      也许检查修改后的时间戳会缩小范围?

      【讨论】:

      • 我接受这个答案,因为其他答案都不适合我。从理论上讲,它必须以某种方式成为可能,但似乎没有人知道如何......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-22
      相关资源
      最近更新 更多