- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 macOS 上,dylib 具有 兼容版本和一个 当前版本 作为元数据,每个都具有 x.y.z.
的形式. otool -L
可以显示这些。
系统或各种工具/程序如何以及何时使用这些版本?
对于 兼容版本 ,我能够发现:
x.y.z
的部分使用的方案?比较是按字典顺序排列的吗?还是分别对 x、y 和 z 有特殊含义? ls -l /usr/lib/libz*
我看到同一个库有许多不同的符号链接(symbolic link),每个符号链接(symbolic link)的名称都有不同的版本。 最佳答案
1. 系统(例如动态链接器)在任何情况下都使用当前版本吗?
是的,当使用 DYLD_VERSIONED_LIBRARY_PATH
时或 DYLD_VERSIONED_FRAMEWORK_PATH
环境变量。来自 man dyld
:
DYLD_VERSIONED_LIBRARY_PATH
This is a colon separated list of directories that contain potential over-
ride libraries. The dynamic linker searches these directories for dynamic
libraries. For each library found dyld looks at its LC_ID_DYLIB and gets
the current_version and install name. Dyld then looks for the library at
the install name path. Whichever has the larger current_version value
will be used in the process whenever a dylib with that install name is
required. This is similar to DYLD_LIBRARY_PATH except instead of always
overriding, it only overrides is the supplied library is newer.
DYLD_VERSIONED_FRAMEWORK_PATH
This is a colon separated list of directories that contain potential over-
ride frameworks. The dynamic linker searches these directories for frame-
works. For each framework found dyld looks at its LC_ID_DYLIB and gets
the current_version and install name. Dyld then looks for the framework
at the install name path. Whichever has the larger current_version value
will be used in the process whenever a framework with that install name is
required. This is similar to DYLD_FRAMEWORK_PATH except instead of always
overriding, it only overrides if the supplied framework is newer. Note:
dyld does not check the framework's Info.plist to find its version. Dyld
only checks the -currrent_version number supplied when the framework was
created.
这些变量仅支持 macOS 和 DriverKit 目标。
NSVersionOfRunTimeLibrary()
查询。 ,以及与
NSVersionOfLinkTimeLibrary()
链接到库的 Mach-O header 中的 current_version .
man ld
中有一些文档:
-compatibility_version number
Specifies the compatibility version number of the library. When a
library is loaded by dyld, the compatibility version is checked and if
the program's version is greater that the library's version, it is an
error. The format of number is X[.Y[.Z]] where X must be a positive
non-zero number less than or equal to 65535, and .Y and .Z are
optional and if present must be non-negative numbers less than or
equal to 255. If the compatibility version number is not specified,
it has a value of 0 and no checking is done when the library is used.
This option is also called -dylib_compatibility_version for compati-
bility.
但这只是事实的一半。对于真正发生的事情,我们必须查看
dyld sources :
// check found library version is compatible
// <rdar://problem/89200806> 0xFFFFFFFF is wildcard that matches any version
if ( (requiredLibInfo.info.minVersion != 0xFFFFFFFF) && (actualInfo.minVersion < requiredLibInfo.info.minVersion)
&& ((dyld3::MachOFile*)(dependentLib->machHeader()))->enforceCompatVersion() ) {
// record values for possible use by CrashReporter or Finder
dyld::throwf("Incompatible library version: %s requires version %d.%d.%d or later, but %s provides version %d.%d.%d",
this->getShortName(), requiredLibInfo.info.minVersion >> 16, (requiredLibInfo.info.minVersion >> 8) & 0xff, requiredLibInfo.info.minVersion & 0xff,
dependentLib->getShortName(), actualInfo.minVersion >> 16, (actualInfo.minVersion >> 8) & 0xff, actualInfo.minVersion & 0xff);
}
除了
0xffffffff
可以用作通配符,这里有趣的是调用
enforceCompatVersion()
:
bool MachOFile::enforceCompatVersion() const
{
__block bool result = true;
forEachSupportedPlatform(^(Platform platform, uint32_t minOS, uint32_t sdk) {
switch ( platform ) {
case Platform::macOS:
if ( minOS >= 0x000A0E00 ) // macOS 10.14
result = false;
break;
case Platform::iOS:
case Platform::tvOS:
case Platform::iOS_simulator:
case Platform::tvOS_simulator:
if ( minOS >= 0x000C0000 ) // iOS 12.0
result = false;
break;
case Platform::watchOS:
case Platform::watchOS_simulator:
if ( minOS >= 0x00050000 ) // watchOS 5.0
result = false;
break;
case Platform::bridgeOS:
if ( minOS >= 0x00030000 ) // bridgeOS 3.0
result = false;
break;
case Platform::driverKit:
case Platform::iOSMac:
result = false;
break;
case Platform::unknown:
break;
}
});
return result;
}
如您所见,如果库声明其最低支持的操作系统版本有些新,那么 dyld 会完全忽略兼容性版本。
--target=arm64-macos10.13
的选项。建立你的图书馆。
/usr/lib/libz.dylib
,那么库也必须具有完全相同的名称作为其名称。如果库具有
/usr/lib/libz.0.dylib
的嵌入式安装路径,那么它将被视为一个不同的库。
/usr/lib/libz.dylib
处有一个文件。那要么是您要查找的库,要么是指向它的符号链接(symbolic link)。但是在这个阶段通常没有理由涉及符号链接(symbolic link)。
compatibility_version
字段处理向前兼容性:如果您链接到版本
1.2.3
,然后任何大于或等于
1.2.3
的版本将工作。但是,如果您以破坏向后兼容性的方式删除或更改导出的 API,则必须使用新的安装名称创建一个新库,并继续发送旧库的最新版本的副本以实现向后兼容性。
/usr/lib/libz.0.dylib
,其中有许多修复错误的更新,扩展了 API 并撞上了
compatibility_version
.所有这些都将作为
/usr/lib/libz.0.dylib
发货,并且该库的最新版本仍然可以使用链接到它的第一个版本的二进制文件。
/usr/lib/libz.0.dylib
发布。 .您因此创建
/usr/lib/libz.1.dylib
并发送两个库,dyld 将加载主二进制文件所针对的任何库。
-lz.0
或
lz.1
在命令行上,这不是特别好,需要手动更新,如果您希望人们采用新版本,这通常很糟糕。因此,您从
/usr/lib/libz.dylib
创建了一个符号链接(symbolic link)。至
/usr/lib/libz.1.dylib
以便
-lz
链接到最新版本的库。
关于macos - 在 macOS 上使用当前版本和兼容版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67055770/
我有一个为 Firefox 3.6 编写的附加组件,现在我正在将其升级到 Firefox 4.0,同时尝试使其与 3.6 兼容。有没有人有尝试这样做的经验,或者关于如何在代码变得太意大利面条式的情况下
我已经安装了 Cassandra 2.0.1 并想在我的应用程序中使用 Astyanax Java API。我在维基上看到了 Cassandra 兼容性表,上面写着 Astyanax 使用 Netfl
是否可以使纯粹在 VBScript(无 COM 对象)中实现的自定义容器类与 For Each 语句一起使用?如果是这样,我必须公开哪些方法? 最佳答案 简而言之,没有 为什么?创建一个可枚举的集合类
我这里的代码很少 int b=3; b=b >> 1; System.out.println(b); 它工作得很好,但是当我将变量 b 更改为 byte、short、float、double 时它包含
我们有一个 Java 客户端,它使用 corba 调用多个第三方系统。这些是实现同一组接口(interface)的不同系统。我们获得了使用这些接口(interface)的库(jar 文件)。例如,这些
我知道从技术上讲 HTML5 是一个“实时规范”,但我想知道它是否符合在类名中添加尾随空格的规定。我没有在规范中看到任何对这种情况的引用,但我的一个队友说它是无效的。也许我错过了什么? 修剪这些空间会
我在 Linux x86-64 上用 C 语言编程。我正在使用一个库,它通过原始 clone 创建多个线程系统调用而不是使用 pthread_create .这些线程运行库内部的低级代码。 我想钩住这
我希望用汇编程序编写一个可启动程序,能够发送和接收网络数据包。我不想使用任何库,我想自己创建它(并在这样做的同时学习)。不幸的是,我无法找到有关最低级别的网卡通信(发送原始套接字)的任何信息。我相信有
是否有除 fixed scoping 之外没有任何更改的 CoffeeScript 分支,以便它在很大程度上与 CoffeeScript 兼容(如果代码没有外部变量赋值则完全兼容)?我会考虑使用可接受
这个问题已经有答案了: Why is BiConsumer allowed to be assigned with a function that only accepts a single para
我的 Java 应用程序需要一个高性能主内存数据库 1] 请建议数据库 -符合 JDBC -独立(即平面文件) -支持内存表 -高性能 -B-TREE索引 2] JAVA中是否有任何技术可以在程序运行
我通常会找到一些以char*作为参数的函数,但是我听说在C++中更推荐std::string。如何将std::string对象与以char* s为参数的函数一起使用?到目前为止,我已经知道了c_str
我正在移植我的一个旧 javascript 文件以与 requireJS 兼容。这是以前代码的样子。 // effect.js (function(exports){ // shorthand
在今天更新我的 SDK 之前,我有工作代码(为了将来引用,请查看问题询问日期)。 .getMap 曾经发出警告,表明它已被弃用,但现在它甚至不被识别为有效输入。我假设这是因为 API 24(Andro
根据 this reference sheet on hyperpolyglot.org , 下面的语法可以用来设置一个数组。 i=(1 2 3) 但是我在 dash 上遇到错误,它是 Ubuntu
我的 MacBook 上安装了 MYSQL 8.0.12(下载版本)。当我尝试转储 mysql40 的兼容版本时,收到错误 Invalid mode to --known: mysql40。我 100
您好,我正在更改我的版本控制系统,我调查了 perforce 是否与 bcm 补救措施兼容。有谁知道其他版本的控制系统也与 bcm 补救措施兼容?? 最佳答案 BMC Remedy 会更接近 Clea
我需要在 python 中的图像上绘制一般坐标网格。我可以计算网格线的像素坐标,因此我只需要一个能够将它们绘制为图像顶部的虚线 的模块。图像以 numpy 数组的形式出现,因此我需要能够在这些格式和绘
库接受文件输入的“传统”方式是做这样的事情: def foo(file_obj): data = file_obj.read() # Do other things here 客户端代
代码 Untitled Document #topDropDownMenu { position: relative;
我是一名优秀的程序员,十分优秀!