我有一个没有源代码的静态库,需要从LuaJIT FFI动态调用它的符号。
由于它是静态的,所以我不能动态加载它,所以我尝试将它嵌入到共享库中,然后在运行时加载共享库。
问题是静态库的导出符号存在于共享库的符号表中,但没有定义。
nm libUSBDevices.a
显示了许多线条,其中有我感兴趣的符号:
00001d80 T _ZN9USBDevice16FlightControllerC1EPKc
00001e30 T _ZN9USBDevice16FlightControllerD1Ev
00000140 T _ZN9USBDevice7AxisFctC1Ev
00000180 T _ZN9USBDevice7AxisFctclEv
然后,我使用以下两个g++命令编译了共享库:
g++ -m32 -c -Wall -Werror -fpic USBDevicesLoader.cpp -llibUSBDevices.a
输出USBDevicesLoader.o (USBDevicesLoader.cpp包含一些在静态库中调用符号的导出函数,这些符号正确地存在于.so中)
g++ -m32 -shared -o libUSBDevicesLoader.so USBDevicesLoader.o
这将输出共享库,但当在运行时加载时,它将显示如下:
[...] symbol lookup error: /home/me/USBDevices-loader/libUSBDevicesLoader.so: undefined symbol: _ZN9USBDevice16FlightControllerC1EPKc
当我在共享库上运行nm时,它将符号显示为未定义的符号:
U _ZN9USBDevice16FlightControllerC1EPKc
U _ZN9USBDevice7AxisFctclEv
我认为问题出在编译命令的某个地方,我还试图直接从.a构建共享库,而不首先编译cpp (只需将USBDevicesLoader.o替换为.a第二个命令,跳过第一个命令),但问题依然存在。
那么,是否有一种方法可以将静态库的所有符号(没有源代码)嵌入到动态库中,然后可以在运行时加载和使用?谢谢
https://stackoverflow.com/questions/68206495
复制相似问题