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

标签 c++ c gcc linker

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

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

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

所以这是我的问题。由于 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

最佳答案

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

关于c++ - 如何在交叉编译期间强制链接到未安装的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29030310/

相关文章:

c++ - ARM 交叉编译

c - 将字符串和字符传递给函数

linux - libstdc++.so.6 缺少更高版本的 GLIBCXX 和 CXXABI,无法更新

c++ - 我的逻辑有什么问题?

c++ - C++ 集合中的迭代器

c++ - C++ 中的容器协方差

c - 为什么我在 GDB 中收到消息 "Single-stepping until exit . . . which has no line number information"?

C - 在 R Holt-Winters 函数中调用的 C_Holt-Winters 函数

c++ - gcc thunk hack 用于多重继承

c - 为什么arm-linux-gcc在进入IRQ模式时只保留r0-r4