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

时间:2015-03-13 10:48:59

标签: c++ c gcc linker

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

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

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

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

以下是一个例子:

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 个答案:

答案 0 :(得分:1)

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

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

这将创建一个相当空的libX11.so,您可以链接到它。重要的部分是这个库的soname,它必须与真正的库的soname相匹配 - 你可以用例如这样来解决这个问题。

readelf -a /lib/libX11.so |grep soname
相关问题