- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试在 OS X (10.7.5) 下对共享库进行版本控制,但我无法让 dyld
识别最大兼容版本(最低版本也可以)。考虑下面的测试代码和以下场景:
二进制链接到 1.0 版本的库,兼容版本 1.0
binary
按预期工作
otool -L binary
:libdyldtest.dylib(兼容版本1.0.0,当前版本1.0.0)
otool -L libdyldtest.dylib
:libdyldtest.dylib(兼容版本1.0.0,当前版本1.0.0)
库已更新并重新编译,移至版本 2.0,兼容版本 1.0
binary
应该仍然有效,而且确实如此,因为库的兼容性已经足够老了
otool -L binary
:libdyldtest.dylib(兼容版本1.0.0,当前版本1.0.0)
otool -L libdyldtest.dylib
:libdyldtest.dylib(兼容版本1.0.0,当前版本2.0.0)
库已更新并重新编译为不兼容的版本。将版本和兼容版本都设置为 3.0。不重新编译二进制文件。
binary
应该停止 工作,因为它需要与 1.0 兼容的东西,但 libdyldtest
仅与 3.0 及更高版本兼容。 为什么会这样?
otool -L binary
:libdyldtest.dylib(兼容版本1.0.0,当前版本1.0.0)
otool -L libdyldtest.dylib
:libdyldtest.dylib(兼容版本3.0.0,当前版本3.0.0)
DYLD_PRINT_LIBRARIES
显示正在加载 libdyldtest.3.0.dylib
问题是上面的 3 个有效,我认为它不应该。这是预期的行为吗?如果不是,我该如何纠正?
注意:相关的dyld source code for 10.7.5似乎没有使用 LibraryInfo
结构的 maxVersion
成员,只有 minVersion
。因此,将最低兼容版本设置得较低可以按预期工作:
binary
按预期停止工作。
otool -L binary
:libdyldtest.dylib(兼容版本1.0.0,当前版本1.0.0)
otool -L libdyldtest.dylib
:libdyldtest.dylib(兼容版本0.0.0,当前版本0.9.0)
binary
结果 原因:库版本不兼容:二进制需要 1.0.0 或更高版本,但 libdyldtest.0.9.dylib
符合预期。谢谢!
库.h:
#ifndef __LIBRARY_H__
#define __LIBRARY_H__
void functionFromLibrary();
#endif /* __LIBRARY_H__ */
库.c:
#include "library.h"
#include <stdio.h>
void
functionFromLibrary()
{
printf("functionFromLibrary()\n");
}
二进制.c:
#include "library.h"
int
main(
int argc,
char *argv[])
{
functionFromLibrary();
return (0);
}
生成文件:
.PHONY: all library binary
MAJOR=1
MINOR=0
COMPAT=1.0
LIBNAME=dyldtest
BINNAME=binary
all: library binary
binary: binary.o
$(CC) $< -L. -l$(LIBNAME) -o $(BINNAME)
library: library.o
$(CC) -dynamiclib $< -Wl,-current_version,$(MAJOR).$(MINOR) \
-Wl,-compatibility_version,$(COMPAT) -Wl,-macosx_version_min,10.6 \
-Wl,-install_name,lib$(LIBNAME).dylib \
-o lib$(LIBNAME).$(MAJOR).$(MINOR).dylib
ln -f -s lib$(LIBNAME).$(MAJOR).$(MINOR).dylib \
lib$(LIBNAME).$(MAJOR).dylib
ln -f -s lib$(LIBNAME).$(MAJOR).dylib lib$(LIBNAME).dylib
clean:
$(RM) *.o lib$(LIBNAME)*.dylib $(BINNAME)
最佳答案
这是预期的行为。
dyld
执行的版本号检查仅限于确保正在加载的库的兼容性 版本高于所使用的库的兼容性版本构建时间。该库的当前 版本是可以编程访问的,但在评估是否应加载特定库时,dyld
不会使用该版本。您可以通过查看 ld
手册页的 -compatibility_version
和 -current_version
部分了解有关这两个版本号的更多信息。
您可以通过使用库的安装名称来实现您想要的效果。您可以通过查看 libSystem.dylib
的使用方式来了解这一点:
mrowe@angara:~$ ls -lha /usr/lib/libSystem.{,B.}dylib
-rwxr-xr-x 1 root wheel 53K Jul 9 2012 /usr/lib/libSystem.B.dylib
lrwxr-xr-x 1 root wheel 17B Jul 9 2012 /usr/lib/libSystem.dylib -> libSystem.B.dylib
mrowe@angara:~$ otool -L /usr/lib/libSystem.dylib | head -2
/usr/lib/libSystem.dylib:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
mrowe@angara:~$
请注意 otool
输出的第二行中的安装名称如何指向名称由版本号限定的 dylib 的版本(在情况 B 中)。如果 Apple 要引入 libSystem.dylib
的向后不兼容修订版,他们可以将其放在 /usr/lib/libSystem.C.dylib
并更新 的符号链接(symbolic link)>libSystem.dylib
指向它。现有程序仍会查找 libSystem.B.dylib
,因为这是在链接时写入其 LC_LOAD_DYLIB
加载命令的安装名称。任何新链接 libSystem.dylib
的程序都会找到 libSystem.C.dylib
并将其安装名称写入它们的 LC_LOAD_DYLIB
加载命令。这样的程序将无法在缺少 libSystem.C.dylib
的系统上启动。
关于c - 如何不忽略 dyld 的最大版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15905310/
我正在尝试运行PowerLoom的Java版本,但是当我尝试在终端中启动它时,出现以下错误消息: dyld: Symbol not found: __cg_jpeg_resync_to_restart
我的项目已成功构建,但我不知道发生了什么?现在它显示了这个错误,我已经从 stackoverflow 和其他来源阅读了很多类似的问题,但没有任何帮助,这里是错误的快照。 我仅使用 SQLite.Swi
我已经将macos更新为Mojave,并且在更新了命令工具之后,当我运行我的C++程序时,出现以下错误 dyld:/Users/rameshkolluru/Dropbox/1D_Multiphase_
我正在尝试构建由 Apple 在此处发布的开源 DYLD: http://www.opensource.apple.com/source/dyld/dyld-97.1/ 我复制了每个文件并尝试构建 X
我更新了 XQuartz,现在它没有加载,提示: Dyld Error Message: Library not loaded: /opt/X11/lib/libfreetype.6.dylib
当我尝试在手机上安装项目时,出现错误:“dyld:未加载库:”,并且在文件“dyld`__abort_with_payload:”中出现了线程1。但是在模拟器上,一切都很好。 因此,我尝试通过测试逐步
当我尝试运行 UI 和单元测试时,出现异常: dyld: could not load inserted library '/private/var/containers/Bundle/Applica
当我尝试构建我的目标时,动态链接器出现此错误: dyld: Library not loaded: @rpath/iPhoneSimulatorRemoteClient.framework/Versi
我有一堆动态库,我需要在运行时从应用程序包中加载它们。我注意到,如果我将我的 dylib 放在 /usr/lib 文件夹中,那么应用程序就可以加载它。我已经阅读了 install_name_tool
当我从命令行运行 iPhone 应用程序时,向项目添加框架时遇到一些困难。我的最终目标是从自动构建过程运行应用程序测试。 当我从 xCode 运行我的应用程序时: 我向我的目标添加了“复制文件”构建阶
我已经使用xcode5.0在iOS 7和iOS6设备上部署了我的应用程序。当我在iOS6上运行时,我的应用程序崩溃了。当我收到崩溃日志时,出现以下错误: Dyld错误消息: dyld: Symbol
将Xcode升级到版本11.1(11A1027)后,我的iOS应用(MyApp)在开始运行时在Xcode中崩溃,并显示以下运行时错误: dyld:找不到符号:___chkstk_darwin 引用自:
我正在尝试使用合成语音使我的代码与 iOS 6 和 7 兼容。我希望它适用于 iOS 7 而不适用于 iOS 6。 问题是,当我在 iOS 6 的模拟器中运行时,它甚至在模拟器启动之前就出现以下错误:
当我尝试将应用程序构建到真正的iOS设备上时,就会发生这种情况。我正在使用Cocoa Touch Framework(在iOS 8 SDK中引入)。在iOS模拟器上可以正常工作。 最佳答案 您的设备也
我一直收到有关我的应用程序在 iOS 6 中加载时崩溃的报告。它是使用 iOS 8 SDK 构建的,在 iOS 7 和 8 上运行良好。我刚刚设法拿到一台 iOS 6 设备进行测试,它确实在启动时崩溃
尝试在 xcode 10 中使用 cocoapods 构建一个 cordova 项目,在 Debug模式下一切正常,但当发布到 Testflight 时,它会立即崩溃并显示错误消息。 Exceptio
我有一个仅在调试配置中使用 SimulatorStatusMagic 的项目。所以我的 Podfile 有以下行: pod 'SimulatorStatusMagic', :configuration
苹果操作系统 10.13.4 我在 shell 中写了命令 'dyldinfo',但是出错了-bash:dyldinfo:找不到命令 希望你能帮助我 最佳答案 在最新版本的 macOS 上,您可以使用
我有一个专门的共享库,它在可执行文件的执行期间动态加载。该库提供函数 b()。此函数依次调用函数 a()。 a 函数是在可执行文件中定义的,而不是库本身,因此我希望能够从库中调用一些可执行文件的代码。
我正在尝试在 OS X (10.7.5) 下对共享库进行版本控制,但我无法让 dyld 识别最大兼容版本(最低版本也可以)。考虑下面的测试代码和以下场景: 二进制链接到 1.0 版本的库,兼容版本 1
我是一名优秀的程序员,十分优秀!