2015-03-13 21 views
1

我与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.so。重要的部分是这个图书馆的soname,它必须与真正的图书馆的soname相匹配 - 你可以用例如

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