VS-Android 在链接到共享库时生成"wrong"名称
VS-Android produces "wrong" names when linking to shared libraries
我正在使用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库使用一个更独特的名称,加载程序会很高兴。
我找到了问题的原因。结果发现我链接到了一个错误的文件(错误的文件夹),其中有一个旧版本的实用程序库。
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 预处理器:插入结构名称中的前一个行号
- 基类中的函数名称解析
- 模板元程序查找相似的连续类型名称
- 没有名称的C++模板参数
- C++中名称篡改的目的是什么
- 如何仅使用对象名称打印特定于对象的成员
- 将依赖名称显式标记为类型名和模板的奇怪之处
- 为什么 Clang 不允许"and"作为函数名称?
- 遮罩结构名称
- c++binary_search函数排序数组(流行名称搜索)出现问题
- RegGetValue在当前用户下找不到名称
- 如何打开并写入一个名称取自C++中字符串的文件
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- 公开最直接的基类模板名称
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么用结构初始化数组需要指定结构名称
- 使用单词"not"作为C ++类的名称会导致VS2019错误
- VS-Android 在链接到共享库时生成"wrong"名称