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

时间:2018-05-22 00:03:58

标签: c++ xcode macos clang abi

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

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

2 个答案:

答案 0 :(得分:0)

我相信Qt用他们的“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)

答案 1 :(得分:0)

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

在命令行上,可以使用-mmacosx-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.