如何在交叉编译期间强制链接到未安装的库

Posted

技术标签:

【中文标题】如何在交叉编译期间强制链接到未安装的库【英文标题】:How to force linkage to non installed libraries during cross compilation 【发布时间】:2015-03-13 10:48:59 【问题描述】:

我与g++ 的情况如下。我构建了一个名为libplugin.so 的共享库,它在运行时由应用程序加载。这个libplugin.so 使用-no-as-needed 链接器选项链接到其他一些共享库,并链接到静态库。

由于libplugin.so 本身不使用列出的库中的任何符号,所以需要-no-as-needed 来使动态加载器加载所有必需的库——这些库实际上只被静态库引用——当插件被在运行时加载。在我的x86 构建机器上,所有列为-no-as-needed 的库都安装在系统中。所以,库在那里建得很好,程序也很好。

现在我正在尝试为ARM交叉编译,但是有一些问题,因为在构建libplugin.so时,链接器在系统中找不到-no-as-needed指示的库。链接无法找到库,因为它们(故意)没有安装。我不想安装它们。

所以这是我的问题。由于libplugin.so 不会以任何方式直接引用传递给-no-as-needed 的库,有没有办法“强制”链接器构建libplugin.so,尽管传递给-no-as-needed 的ARM 库在我的x86 构建中不存在系统?

下面是一个例子:

arm-linux-gnueabihf-g++ -o libplugin.so module1.o module2.o -L./libstatic.a -Wl,--no-as-needed -lX11 -lXext -shared -s -fPIC
arm-linux-gnueabihf-ld: cannot find -lX11

【问题讨论】:

【参考方案1】:

Afaik 你不能轻易做到这一点。但是由于您的库不使用您要链接到的共享库中的任何内容,您应该能够通过创建一个虚拟 libX11 库并链接到该库来欺骗链接器:

arm-linux-gnueabihf-gcc -x c -shared -o libX11.so -Wl,-soname,libX11.so.6 /dev/null

这将创建一个相当空的 libX11.以便您可以链接到。重要的部分是这个库的 soname,它必须与真实库的 soname 相匹配 - 你可以用例如:

readelf -a /lib/libX11.so |grep soname

【讨论】:

以上是关于如何在交叉编译期间强制链接到未安装的库的主要内容,如果未能解决你的问题,请参考以下文章

libevent 交叉编译生成的库怎么不能用

如何Ubuntu配置多个交叉编译工具??

imx6ull+debian10 构建静态qt交叉编译环境

交叉编译器库

强制链接到未使用的共享库

树莓派交叉编译(PS交叉编译链下载安装带WiringPi库交叉编译)