我应该如何构建一个 C++ 应用程序以分发到不同版本的 OS X/macOS?

How should I build a C++ app for distribution to different versions of OS X/macOS?

我知道某些版本的编译器会破坏 C++ ABI,但我不知道是哪个版本。

我是否需要为我想要支持的每个 OS 版本使用不同版本的 Xcode?如果是这样,我应该使用哪个版本的 Xcode?

我相信 Qt 用 table 的 "Supported configurations for Qt 5.10"

回答了这个问题

https://doc.qt.io/qt-5.10/supported-platforms.html

三个构建将使用:

Xcode 8.2 (macOS 10.11)

Xcode 8.3.3 (macOS 10.12)

Xcode 9 (macOS 10.13)

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

在命令行中,可以使用-mmacosx-min-version=设置部署目标。如果您尝试使用目标版本上不可用的 library/language 功能(例如 std::shared_timed_mutex,一个新的 C++14 功能),编译器甚至会出错。请注意,compiler/headers 中实现了一些新的语言功能(如此处的 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.