如何在交叉编译期间强制链接到未安装的库
How to force linkage to non installed libraries during cross compilation
我与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
Afaik 你不能轻易做到这一点。但是,由于您的库不使用要链接到的共享库中的任何内容,因此您应该能够通过创建一个虚拟的libX11库并链接到该库来欺骗链接器:
arm-linux-gnueabihf-gcc -x c -shared -o libX11.so -Wl,-soname,libX11.so.6 /dev/null
这将创建一个可以链接到的相当空的 libX11.so。重要的部分是这个库的别名,它必须与真实库的别名相匹配 - 你可以用例如
readelf -a /lib/libX11.so |grep soname
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- CMake-按正确顺序将项目与C运行时对象文件链接
- 将"libpqxx"与Visual Studio 2013链接/安装,以便与PostgrSQL建立C++连接
- 如何防止 CMake 在构建时(而不是在安装时)为共享库创建符号链接?
- Assimp模型加载库安装/链接故障
- 安装Glog链接错误
- C++ / GoogleTest - 如何在链接目录中为每个测试运行安装程序
- 在 Code::Blocks 中使用自定义安装目录在 Windows 上链接 SDL-bgi
- 协和式飞机安装:需要链接一个lp求解器才能使用此功能
- boost/filesystem.hpp未通过Homebrew安装的OSX Boost链接
- 安装C和C++的MessagePack实现时发生链接器错误
- 已安装 MPI,但仍出现链接器错误LNK2019
- 进行安装与就地链接
- libtool:安装:错误:在安装之前将"libmyprog.la"与上述命令重新链接
- CMake,链接目录和多个Boost安装
- LNK4099链接器警告与干净安装Qt SDK和Visual c++ 2008
- OSX 10.10.5 - c++库,如何更改链接或添加环境标志,以酿造安装版本
- PCL安装链接直接到boost安装目录
- 将本地JSONCpp安装与CMake和ExternalProject_Add链接
- 链接错误:在Visual Studio(2012)中使用NuGet安装boost zlib过滤器