gcc链接器:强制库依赖项

2024-05-23 22:27:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个带有一些依赖项的共享库,包括readlinencurses

g++ -m64 -shared -o lib/libXYZ.so <some .o files> -lz -lgmp -lreadline -lncurses

但是,当我在生成的库上运行ldd时,没有显示对ncurses的依赖关系:

ldd lib/libXYZ.so 
    linux-vdso.so.1 =>  (0x00007ffe5399e000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fd9d4d9e000)
    libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fd9d4b2a000)
    libreadline.so.6 => /lib/x86_64-linux-gnu/libreadline.so.6 (0x00007fd9d48e4000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fd9d45e0000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd9d42da000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd9d40c4000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd9d3cff000)
    libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fd9d3ad6000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fd9d59f5000)

当我尝试使用这个库libX来生成一个C应用程序时,一切正常。你知道吗

使用它来构建Cython代码会导致一个损坏的Python模块:

 ImportError: <python-environment>/lib/libreadline.so.6: undefined symbol: PC

解决方案尝试1

在构建Python模块时,显式地将ncurses添加到库列表中。你知道吗

我不喜欢这样,因为所有依赖项都应该包含在libX中。你知道吗

解决方案尝试2

强制Python模块使用C代码最初链接到的readline库。ncurses是必需的,因为readline,而我的anaconda Python环境有自己的readline版本,因为设置了运行时库路径。如果我从此路径中删除libreadline.so,链接器将使用我的全局库,并且ncurses依赖关系不会造成任何困难。你知道吗

这显然是一个黑客攻击,迫使用户扰乱他们的Python环境。你知道吗

首选解决方案(不知道如何解决)

当库libX是用readline构建的时,简单地强制ncurses的依赖关系。你知道吗

使用gcc/g++链接器有什么方法可以做到这一点吗?你知道吗

编辑

显然,构建Python模块不需要Anacondareadline包。删除它解决了这个问题—很可能是因为使用了readline库,而libXYZ链接到了该库。你知道吗


Tags: 模块gnureadlineso关系链接linuxlib