首页 > 其他分享 >clang在编译时指定目标文件所需的最低macOS版本

clang在编译时指定目标文件所需的最低macOS版本

时间:2022-11-05 21:02:34浏览次数:54  
标签:macOS name text clang 编译 version marks type id

调研这个的原因,是因为有个同事在macOS 12.2上打包好的程序,放在macOS 10.15上运行时报错:

Dyld Error Message:
  Symbol not found: __ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv
  Referenced from: /Library/Application Support/XXX.dylib (which was built for Mac OS X 12.2)
  Expected in: /usr/lib/libc++.1.dylib

调研了一番,发现这个是因为Apple的SDK使用weak linking来支持不同版本的macOS。

目标文件所需的最低macOS版本有个专有名称“deployment target”。   查看库的deployment target 查看*.dylib、*.a或者主程序的deployment target属性、sdk版本:
otool -l 7z.dylib | grep -E "(minos|sdk)"
find . -name "*.a" | xargs otool -l | grep -E "(minos|sdk)"

通过命令行参数设置deployment target clang/clang++在编译时指定deployment target的命令行参数是-mmacos-version-min,比如:-mmacos-version-min=10.15,指定最低为Catalina的最后一个版本10.15。 针对iOS等有类似的开关如-miphoneos-version-min、-mtvos-version-min、 -mwatchos-version-min。 -mmacos-version-min有个别名-mmacosx-version-min,别名只是为了兼容,尽量不使用这个别名。 clang会根据这个命令行参数来定义编译器内置宏MAC_OS_X_VERSION_MIN_REQUIRED等,而SDK头文件<AvailabilityMacros.h>、<Availability.h>中有对这些宏的检查,根据宏决定哪些符号采用weak linking。weak linking的符号在编译时不会报错,dylib加载时也不会报错,在用到对应的符号时如果不存在才会报错。   通过环境变量设置deployment target clang的这个参数也可通过环境变量来设置。命令行参数优先于环境变量。 MACOSX_DEPLOYMENT_TARGET IPHONEOS_DEPLOYMENT_TARGET TVOS_DEPLOYMENT_TARGET WATCHOS_DEPLOYMENT_TARGET DRIVERKIT_DEPLOYMENT_TARGET   我们的工程以及我们的工程所直接/间接依赖的所有静态库/动态库,都需要在编译时指定相同的deployment target。 省事的办法是通过环境变量来统一设置,在开始整个打包之前设置一下。 其次是命令行开关。不同工程类型的命令行开关设置方法有差异。以下是命令行开关的设置。   通过vcpkg install编译的库 需要更改vcpkg/triplets/x64-osx.cmake文件的内容,增加下面三行(理论上只要第一行即可,但vcpkg目前貌似有bug,导致VCPKG_OSX_DEPLOYMENT_TARGET只对CMake工程生效,对其他类型的工程不生效。所以需要第二行、第三行): set(VCPKG_OSX_DEPLOYMENT_TARGET "10.15") set(VCPKG_C_FLAGS -mmacosx-version-min=10.15) set(VCPKG_CXX_FLAGS -mmacosx-version-min=10.15) 也可以复制这个文件到某个目录下,在复制出来的文件中增加上面这三行,然后给vcpkg install传递--overlay-triplets参数以使用这个修改过的triplet文件。这样通过vcpkg install安装的所有库的deployment target都是10.15。   autoconf类型的工程 比如libiconv库是手动执行autoconf编译的,需要在configure时增加参数: ./configure CFLAGS=-mmacos-version-min=10.15 CPPFLAGS=-mmacos-version-min=10.15   CMake工程 在CMakeLists.txt里的project()语句之前增加一句: set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15") 或者 set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "" FORCE)   Xcode工程 在界面的工程属性中可以设置deployment target。   Makefile工程 在makefile里自行给clang传递参数-mmacos-version-min=10.15即可。

标签:macOS,name,text,clang,编译,version,marks,type,id
From: https://www.cnblogs.com/z16166/p/16861268.html

相关文章

  • chromium的下载和编译
    chromium的下载和编译(流程详解)u012983289 于2022-08-2317:08:54chromedevtoolschromec++ 准备工作:1、         2、安装VS2019,且请......
  • onps栈移植说明(2)——编译器及os适配层移植
    2.字节对齐及基础数据类型定义    协议栈源码(码云/github)port/include/port/datatype.h中根据目标系统架构(16位or32位)及所使用的编译器定义基础数据类型及字节......
  • MacOS13系统升级动态壁纸无法安装解决方法
    MacOS13系统升级,导致网站上的壁纸无法双击安装,怎么办?这里小编为大家带来了解决方法,一起来看看!网站上下载的壁纸安装包打开,双击安装没有反应键盘上按住shiftcommand.三个键,找......
  • 3A5000 英雄无敌3编译
    下载vcmi源代码1.0.0https://github.com/vcmi/vcmi/releases/tag/1.0.0解压到vcmi1.0.0下载两个依赖库1.fuzzylitehttps://github.com/fuzzylite/fuzzylite/tree/......
  • 英雄无敌3开源引擎vcmi的编译安装
      vcmi是什么?vcmi是经典的SLG英雄无敌3的开源游戏引擎。原来的英雄无敌3只能在Windows上玩,现在通过vcmi,我们也可以在Unix/Linux,苹果等其它系统上玩了。......
  • gcc的编译过程
    1.预处理,生成.i的文件。(input)2.将.i的文件转换成汇编语言,生成.s的文件3.生成机器语言文件,.o的文件4.连接目标代码,生成可执行文件.out ......
  • ObjectArx多版本编译
    您必须使用Microsoft®VisualStudio®2019版本16.7编译ObjectARX应用程序以在AutoCAD2022 中使用。AutoCAD2022面向.NETFramework4.8,这是Microsoft®VisualS......
  • 解读Vue3模板编译优化
    今天的文章打算学习下Vue3下的模板编译与Vue2下的差异,以及VDOM下Diff算法的优化。编译入口了解过Vue3的同学肯定知道Vue3引入了新的组合Api,在组件mount阶......
  • WiredTiger引擎编译 及 LT_PREREQ(2.2.6)问题解决
    近期需要为异构引擎做准备,wiredtiger以其优异的性能(B-tree和LSM-tree都支持)和稳定性(Mongodb的默认存储引擎)被我们备选为异构引擎里的一个子引擎,后续将深入wiredtiger......
  • 编译型语言与解释型语言
    上一章我们已经了解到,编程语言其实就是一种我们人类易于理解的程序语言。我们用这种编程语言编写的程序就称为源代码。这些源代码是通过翻译器这么个东西,被翻译成二进制指......