首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在共享库(Linux)中嵌入静态库?

如何在共享库(Linux)中嵌入静态库?
EN

Stack Overflow用户
提问于 2021-07-01 08:04:40
回答 1查看 247关注 0票数 2

我有一个没有源代码的静态库,需要从LuaJIT FFI动态调用它的符号。

由于它是静态的,所以我不能动态加载它,所以我尝试将它嵌入到共享库中,然后在运行时加载共享库。

问题是静态库的导出符号存在于共享库的符号表中,但没有定义。

代码语言:javascript
运行
复制
nm libUSBDevices.a

显示了许多线条,其中有我感兴趣的符号:

代码语言:javascript
运行
复制
00001d80 T _ZN9USBDevice16FlightControllerC1EPKc
00001e30 T _ZN9USBDevice16FlightControllerD1Ev
00000140 T _ZN9USBDevice7AxisFctC1Ev
00000180 T _ZN9USBDevice7AxisFctclEv

然后,我使用以下两个g++命令编译了共享库:

代码语言:javascript
运行
复制
g++ -m32 -c -Wall -Werror -fpic USBDevicesLoader.cpp -llibUSBDevices.a

输出USBDevicesLoader.o (USBDevicesLoader.cpp包含一些在静态库中调用符号的导出函数,这些符号正确地存在于.so中)

代码语言:javascript
运行
复制
g++ -m32 -shared -o libUSBDevicesLoader.so USBDevicesLoader.o

这将输出共享库,但当在运行时加载时,它将显示如下:

代码语言:javascript
运行
复制
[...] symbol lookup error: /home/me/USBDevices-loader/libUSBDevicesLoader.so: undefined symbol: _ZN9USBDevice16FlightControllerC1EPKc

当我在共享库上运行nm时,它将符号显示为未定义的符号:

代码语言:javascript
运行
复制
U _ZN9USBDevice16FlightControllerC1EPKc
U _ZN9USBDevice7AxisFctclEv

我认为问题出在编译命令的某个地方,我还试图直接从.a构建共享库,而不首先编译cpp (只需将USBDevicesLoader.o替换为.a第二个命令,跳过第一个命令),但问题依然存在。

那么,是否有一种方法可以将静态库的所有符号(没有源代码)嵌入到动态库中,然后可以在运行时加载和使用?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-01 09:35:20

您可以使用--whole-archive选项来实现这一点,如这里文档中所示

-整体存档:对于命令行中在-存档选项之后提到的每个归档,在链接中包含存档中的每个目标文件,而不是搜索所需的目标文件。这通常用于将存档文件转换为共享库,迫使每个对象都包含在结果共享库中。此选项可多次使用。

例如:

代码语言:javascript
运行
复制
g++ -shared -o libnew.so -Wl,--whole-archive libmylib_static.a -Wl,--no-whole-archive

然后,您可以像通常那样链接到共享的libnew.so库。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68206495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档