VS-Android 在链接到共享库时生成"wrong"名称

VS-Android produces "wrong" names when linking to shared libraries

本文关键字:wrong 名称 链接 共享 VS-Android      更新时间:2023-10-16

我正在使用VS Android来构建我的NDK程序。我有两个库,"bridge"answers"utils",第一个库使用第二个库。这两个库都编译成功,文件的名称正确为libbridge.so和libutils.so。但是,当我尝试加载文件时,我收到一个不满意的链接错误,说libbridge.so无法访问libutils。它为什么要搜索liblibutils?

以下是我用来加载库的Java代码:

static
{
    System.loadLibrary("utils"); // This loads OK
    System.loadLibrary("bridge"); // This is found but causes the UnsatisfiedLinkError
}

我得到的确切错误是:

java.lang.UnsatisfiedLinkError: dlopen failed: could not load library "liblibutils"
needed by "libbridge.so"; caused by library "liblibutils" not found

两个库文件都位于同一文件夹中:

(projectfolder)/libs/armeabi-v7a/libbridge.so
(projectfolder)/libs/armeabi-v7a/libutils.so

现在,在Visual Studio中,libutils.so链接阶段的相关输出是:

-o E:/NDKProject/Debug/armeabi-v7a/libutils.so -lc -lm -llog -lgcc -Wl,-soname,libutils

以及libbridge.so:的相关输出

-o E:/NDKProject/Debug/armeabi-v7a/libbridge.so
-LE:/NDKProject/Debug/armeabi-v7a -lutils -lc -lm -llog -lgcc -Wl,-soname,libbridge

libutils.so的项目属性如下:

  • 目标名称:libutils
  • "soname"设置:$(TargetName)

对于libbridge.so:

  • 目标名称:libbridge
  • "soname"设置:$(TargetName)
  • 其他依赖项:-lutils

我很困惑。当桥接库尝试使用utils库时,额外的"lib"从哪里来?如果我不链接utils库并注释掉对utils库中内容的所有调用,那么utils库确实成功加载,桥接库也是如此。

到目前为止,我已经尝试将目标名称更改为"utils"而不是"libutils",但没有成功。我还尝试使用lib$(TargetName)作为soname设置,但它也不起作用。

我不知道日志为什么提到liblibutils,但如果你想让它在典型的Android系统上工作,你的代码应该更改。原因是libutils.so是标准分布的一部分,并且位于/system/lib中。对于loadLibrary()和本机加载程序,/system/lib优先于应用程序特定的lib目录和libutils。因此从未有机会加载。因此,不满意的链接错误是不可避免的。

为您的utils库使用一个更独特的名称,加载程序会很高兴。

我找到了问题的原因。结果发现我链接到了一个错误的文件(错误的文件夹),其中有一个旧版本的实用程序库。