Почему -mmacosx-version-min=10.10 не запрещает использование функции, помеченной как начиная с 10.11?
По моему пониманию, как наличие макросов и -mmacosx-version-min
флаг работает, следующий код должен не скомпилироваться при нацеливании на OS X 10.10:
#include <Availability.h>
#include <CoreFoundation/CoreFoundation.h>
#include <Security/Security.h>
#if !defined(__MAC_OS_X_VERSION_MIN_REQUIRED)
#error
#endif
#if __MAC_OS_X_VERSION_MIN_REQUIRED < 101000
#error __MAC_OSX_VERSION_MIN_REQUIRED too low
#endif
#if __MAC_OS_X_VERSION_MIN_REQUIRED > 101000
#error __MAC_OSX_VERSION_MIN_REQUIRED too high
#endif
int main() {
size_t len = 0;
SSLContextRef x{};
auto status = SSLCopyRequestedPeerNameLength(x, &len);
return status != 0;
}
потому что функция SSLCopyRequestedPeerNameLength
помечен как доступный в 10.11 в SecureTransport.h
:
$ grep -C5 ^SSLCopyRequestedPeerNameLength /System/Library/Frameworks//Security.framework/Headers/SecureTransport.h
/*
* Server Only: obtain the hostname specified by the client in the ServerName extension (SNI)
*/
OSStatus
SSLCopyRequestedPeerNameLength (SSLContextRef ctx,
size_t *peerNameLen)
__OSX_AVAILABLE_STARTING(__MAC_10_11, __IPHONE_9_0);
Тем не менее, когда я компилирую в командной строке -mmacosx-version-min=10.10
Я не получаю никакого предупреждения, несмотря на -Wall -Werror -Wextra
:
$ clang++ -Wall -Werror -Wextra ./foo.cpp --std=c++11 -framework Security -mmacosx-version-min=10.10 --stdlib=libc++ ; echo $?
0
Есть ли какое-то дополнительное определение, которое мне нужно предоставить, или специальное предупреждение, чтобы убедиться, что я не выявляю зависимость от API более ранних, чем 10.10? Я действительно ожидал, что -mmacosx-version-min=10.10
будет препятствовать использованию API с тегами с более высокими номерами версий.
Что я здесь не так понял?
Использование XCode 10.0 (10A255) на MacOS 10.13.6 здесь.
1 ответ
Теперь, когда я могу ответить на свой вопрос, я буду: вам нужно добавить -Wunguarded-availability
на ваши флаги компиляции. Только тогда вы получите предупреждение / ошибку.