我对 Linux 比较陌生,在尝试弄清楚 .SO 文件的复杂性以及(64 位)共享库(及其版本、依赖项等)如何工作时遇到了困难;以及如何链接它们并在基本的 C++ 程序中使用它们?
场景是这样的:我有一个名为 libfaidtz.so.3.0.0_debian6_64bit 的共享库文件(单个物理文件)。我已经在 VMWare 上安装了 Debian(最新版本)64 位。我已经安装了(我相信)所有基本的 C++ 开发工具都使用 apt-get。
现在我希望用 C++ 编写一个简单的程序,它将链接 libfaidtz.so.3.0.0_debian6_64bit,并使我能够调用此 .so 文件“导出”的两个特定函数。不幸的是,我的机器上设置的环境/系统阻止我成功链接到这个库。
有人可以指导我吗?
我在下面包含了有关 .SO 文件本身的一些相关详细信息。我希望使用的函数(来自 .SO 文件)具有以下函数原型(并且应该可以工作):
int32_t DEF_EXPORT TZ_FAID_Size(int64_t start_time,
int32_t roster_count,
int64_t * roster_from,
int64_t * roster_to,
int32_t * roster_ids,
int32_t & id_cnt);
我来自 Windows 背景(动态链接和 DLL),并且正在努力让这个 .SO 文件在基本的 C++ 测试程序中得到喜欢和使用。
root@debian:/home/maitreya/lib# ldd libfaidtz.so.3.0.0_debian6_64bit
linux-vdso.so.1 => (0x00007fff667ff000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f3300a6f000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f33007ed000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3300461000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f330024b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3300f93000)
root@debian:/home/maitreya/lib# nm libfaidtz.so.3.0.0_debian6_64bit
0000000000208c70 d DW.ref.__gxx_personality_v0
0000000000006ebb T TZ_FAID_Process
0000000000006e04 T TZ_FAID_Size
0000000000007447 T TZ_FAID_Version
0000000000208028 a _DYNAMIC
0000000000208230 a _GLOBAL_OFFSET_TABLE_
w _Jv_RegisterClasses
00000000000011ca T _Z15FetchExpiryDatePiS_S_
等等..
如果您查看系统上安装的一些标准库,您会发现它们是软链接的。例如:我有/lib/libgpm.so.2.1.0,带有软链接/lib/libgpm.so。
尝试创建一个到您的库的软链接 libfaidtz.so,然后使用
-lfaidtz
进行链接。
./lpmake --metadata-size 65536 --super-name super --metadata-slots 2 --device super:9126805504 --group main:5228367872 --partition system:readonly:3548729344:main --image system=. /system.img --partition 供应商:readonly:1380638720:main --image供应商=./vendor.img --partition odm:readonly:937984:main --image odm=./odm.img --sparse --output ./supernew.img 设备超级က super.img