我正在构建一个带有一些依赖项的共享库,包括readline
和ncurses
:
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模块不需要Anaconda的readline
包。删除它解决了这个问题—很可能是因为使用了readline
库,而libXYZ
链接到了该库。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐