我应该如何构建一个C++;用于分发到不同版本的OS X/macOS的应用程序? 我知道编译器的某些版本会破坏C++的ABI,但我不知道哪个版本。

我应该如何构建一个C++;用于分发到不同版本的OS X/macOS的应用程序? 我知道编译器的某些版本会破坏C++的ABI,但我不知道哪个版本。,c++,xcode,macos,clang,abi,C++,Xcode,Macos,Clang,Abi,对于我想要支持的每个操作系统版本,我是否需要使用不同版本的Xcode?如果是这样的话,我应该使用哪个版本的Xcode?我相信Qt会用“Qt5.10支持的配置”表回答这个问题 这三个版本将使用: Xcode 8.2(macOS 10.11) Xcode 8.3.3(macOS 10.12) XCODER 9(MACOS 10.13)您似乎期待在Linux上常见的C++编译器/ ABI兼容性问题。OSX/macOS基本上没有这样的问题——您可以根据最新的SDK(10.13)构建二进制文件,并将部

对于我想要支持的每个操作系统版本,我是否需要使用不同版本的Xcode?如果是这样的话,我应该使用哪个版本的Xcode?

我相信Qt会用“Qt5.10支持的配置”表回答这个问题

这三个版本将使用:

Xcode 8.2(macOS 10.11)

Xcode 8.3.3(macOS 10.12)


XCODER 9(MACOS 10.13)

您似乎期待在Linux上常见的C++编译器/ ABI兼容性问题。OSX/macOS基本上没有这样的问题——您可以根据最新的SDK(10.13)构建二进制文件,并将部署目标设置为您想要支持的最旧OS版本(即10.10)。生成的二进制文件将在10.10及更高版本上运行,无需为不同的操作系统版本构建多个二进制文件

在命令行上,可以使用
-mmacox min version=
设置部署目标。如果您试图使用目标版本上不可用的库/语言功能(如
std::shared_timed_mutex
,一种新的C++14功能),编译器甚至会出错。请注意,一些新的语言功能(如
std::make_unique
)是在编译器/头中实现的,因此旧的库不是问题:

$ cat test5.cpp
#include <memory>
#include <shared_mutex>

int main()
{
    auto x = std::make_unique<int>(3);
    printf("%d\n", *x);
    std::shared_timed_mutex y;
    return 0;
}
$ clang++ -std=c++14 -o test5 test5.cpp -mmacosx-version-min=10.9
test5.cpp:8:7: error: 'shared_timed_mutex' is unavailable: introduced in macOS 10.12
        std::shared_timed_mutex y;
             ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/shared_mutex:204:58: note: 'shared_timed_mutex' has been
      explicitly marked unavailable here
class _LIBCPP_TYPE_VIS _LIBCPP_AVAILABILITY_SHARED_MUTEX shared_timed_mutex
                                                         ^
1 error generated.
$cat test5.cpp
#包括
#包括
int main()
{
自动x=标准::使_唯一(3);
printf(“%d\n”,*x);
std::共享\u定时\u互斥锁y;
返回0;
}
$clang++-std=c++14-o test5 test5.cpp-mmacosx版本最小值=10.9
test5.cpp:8:7:错误:“共享\u定时\u互斥”不可用:在macOS 10.12中引入
std::共享\u定时\u互斥锁y;
^
/Applications/Xcode.app/Contents/Developer/Toolchains/xcodefault.xctoolchain/usr/include/c++/v1/shared_mutex:204:58:注意:“shared_timed_mutex”已被删除
此处显式标记为不可用
类\u LIBCPP\u类型\u可视性\u LIBCPP\u可用性\u共享\u互斥共享\u定时\u互斥
^
生成1个错误。

Xcode附带OSX SDK。每个SDK都记录了与之兼容的OSX版本。通常,宏可用于隐藏API,使其不受“更现代”的操作系统的影响,而不受目标操作系统的影响。如果你想得到一个简单的答案,你必须更具体;您的问题需要一个相当大的表和重要的研究,远远超过您可能的实际问题,并且该表每隔几个月就会过时。我可能希望限制构建的数量。如果我选择支持最新的三个ABI,你知道我应该在这三个版本中使用什么吗?我只是意识到我不知道你想要什么。你是说3个最新的操作系统版本吗?3个最新的通话约定(!)?stdlib最近3次abi突破?C++的3个最新版本?请更具体一点。如果我理解它,我需要为任何破坏ABI的东西做另一个构建。所以我的问题变成了如何识别Xcode的那些版本。我可以浏览你提到的SDK文档。我希望这三个构建可以支持OS的三个最新版本。通常一个构建可以支持3个版本的OS/X。抓住最新的XCODE,设置预处理器令牌。HMM,我在考虑安装的LIBC++库的ItAuthC++ C++ ABI。即使一个应用程序针对的是一个旧的SDK,我的理解是系统上默认只安装了一个/usr/lib/libc++.dylib。我认为所有使用C++的应用程序,不管应用程序所选择的目标SDK,都必须使用相同的LBC++.DyLIB。但这很有趣-一个应用程序如何使用不同的libc++.dylib?是的,所有应用程序都使用系统附带的单个libc++。但是,ABI在版本之间保持兼容,编译器/链接器知道目标C++中的C++特性将如何使用,并使二进制与该版本兼容。我编辑了我的文章来展示一个例子(当我在10.13上构建了一个针对10.9的二进制文件时,它确实在10.9上运行),这是一个很好的信息,谢谢。今晚我会再看一遍。但是有一个问题-你说“ABI在不同版本之间保持兼容”你是说安装在10.10上的libc++使用与安装在10.13上的libc++相同的ABI吗?或者C++的ABIS是不同的但兼容的?