如何查看libboost_python.so使用的Python版本?

10 投票
4 回答
10334 浏览
提问于 2025-04-17 08:52

我想知道boost_python.so这个文件是期待哪个版本的Python。我的电脑上装了多个Python版本,而我并没有自己编译或安装boost(也没有管理员权限)。

我该怎么判断boost_python.so是为哪个版本的Python编译的呢?

我在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

4 个回答

3

来自: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 配置文件。如果存在,检查里面是否有 'using python' 这个命令。如果没有,运行 bjam 时加上 -d2 选项,这样可以找出它默认使用的 Python 的位置。显然,这不是一种直接的方法,但根据输入结果你可能能得到一个大致的答案(也许这就足够了)。

3

这就是你想要的东西吗?

~/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

希望对你有帮助!

0

有趣的是,在我的OS X系统上,otool -L确实能列出python库,但在我能接触到的Linux系统上,它似乎被当作未满足的依赖,没有出现在ldd的输出中。

在我的情况下,我知道它是针对python 2.7编译的,但查看strings /.../libboost_python.so的输出时,没有看到提到2.7,而27只出现在一些与python版本无关的混淆符号中。

所以我得出的结论是,如果不去比较2.6和2.7版本之间符号的API差异,是无法判断的。

也许检查修改时间戳可以缩小范围呢?

撰写回答