如何使用后缀为so.x.y类型的so库,例如libxxx.so.3.1、libxxx.so.3.1.0 ?

使用系统的工具链编译出opencv(3.1.0)的so库,由于生成的so的后缀为so.x.y.z,无法打进应用包使用。

阅读 4k
avatarAI BotBETA

在Linux系统中,共享库(也称为动态链接库或.so文件)通常具有版本号,例如libxxx.so.3.1.0。这些版本后缀有助于系统处理多个版本的相同库,并确保应用程序链接到正确的版本。然而,有时候你可能希望创建一个没有完整版本号的库,如libxxx.so.3,或者只包含主版本号的库,如libxxx.so

如果你想使用一个带有so.x.y类型的库,通常你的应用程序或系统会在运行时动态地查找它。你可以通过设置LD_LIBRARY_PATH环境变量来指定库文件所在的目录,或者将库文件所在的目录添加到/etc/ld.so.conf文件中,然后运行ldconfig来更新链接器缓存。

关于你提到的opencv(3.1.0)生成的so.x.y.z库,如果无法直接用于应用包,有几种方法可以尝试:

  1. 创建符号链接:你可以创建一个指向完整版本库的符号链接,只有主版本号。例如,如果你有一个libopencv_core.so.3.1.0文件,你可以创建一个名为libopencv_core.so.3的符号链接。
ln -s libopencv_core.so.3.1.0 libopencv_core.so.3
  1. 修改应用程序的链接:如果可能的话,你可以修改应用程序的链接设置,使其链接到库的较低版本号,而不是具体的完整版本号。这通常涉及到修改编译脚本或构建系统。
  2. 使用静态库:如果你的应用包大小不是问题,你可以考虑使用OpenCV的静态库(.a文件)。静态库在编译时与应用程序一起编译,因此不需要在运行时动态链接。
  3. 重新编译OpenCV:如果上述方法都不适用,你可能需要重新编译OpenCV,并在编译过程中指定不同的版本号。这通常涉及到修改OpenCV的构建脚本或配置文件。

请注意,在修改库或应用程序的链接设置时,需要确保版本兼容性。不同版本的库可能有不同的API或行为,因此确保你的应用程序与所选的库版本兼容非常重要。

1 个回答

当前应用的so是IDE侧打包带入的,允许应用通过 libxxx.so.x的方式提供so,如果需要同时带入两个版本的 so,real name 与 so name 名字要相同,明确到主版本号libxxx.x,不需要带上 .y.z;所以目前libxxx.so是能够使用的,libxxx.3.1以及libxxx.so.3.1.0需要改成libxxx.x的形式使用。然后需要在CMakeLists.txt文件中重新配置并编译。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进