Я использую 10.9.2 и установил GCC 4.8.2 через MacPorts (sudo port install gcc48 +universal
) и не может скомпилировать код Objective-C, который устанавливает -mmacosx-version-min=10.8
или любая другая версия и включает в себя Фонд. Если я установлю версию на 10.9
или не устанавливайте это вообще, это работает.
Вот код:
#include <Foundation/Foundation.h>
int main() {
return 0;
}
Вот команда:
g++-mp-4.8 objctest.m -mmacosx-version-min=10.8 -framework Foundation
Я получаю ошибку:
In file included from /usr/include/Availability.h:148:0,
from /opt/local/lib/gcc48/gcc/x86_64-apple-darwin13/4.8.2/include-fixed/math.h:46,
from /System/Library/Frameworks/CoreFoundation.framework/Headers/CoreFoundation.h:19,
from /System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:6,
from objctest.m:1:
/System/Library/Frameworks/Foundation.framework/Headers/NSUserNotification.h:16:45: error: expected ',' or '}' before '__attribute__'
NSUserNotificationActivationTypeReplied NS_AVAILABLE(10_9, NA) = 3
^
Даже если я добавлю аргумент -isysroot следующим образом:
-isysroot `xcodebuild -version -sdk macosx Path`
Это все еще не работает (хотя это дает ошибки относительно SDK).
MacPorts GCC не работает или это проблема с заголовками GCC и OS X?
Моя конечная цель — скомпилировать полную программу (Qt gui) для 10.6, которая использует функции C ++ 11, поэтому GCC является обязательным условием, так как 10.6 не имеет libc ++.
Обновление 1: Применяются заголовки OS X __attribute__((weak_import))
к отдельному типу перечисления, и GCC, очевидно, не поддерживает это:
Для типа enum, struct или union вы можете указать атрибуты либо между тегом enum, struct или union и именем типа, либо только после закрывающей фигурной скобки определения.
Я не хочу исправлять заголовки SDK, так что, похоже, это не нужно.
Обновление 2Это документированное расширение Clang:
Clang позволяет записывать атрибуты на отдельных счетчиках. Это позволяет использовать перечислители как устаревшие, сделать их недоступными и т. Д. Атрибут должен появляться после имени перечислителя и перед любым инициализатором.
У вас возникла проблема при попытке использовать заголовки фреймворка с gcc-4.8. На что он жалуется, так это на атрибут перечислителя, например,
enum foo {
foo_alice = 1,
foo_bob = 2,
foo_carol __attribute__((deprecated)) = 3
};
но gcc не поддерживает это; его расширение лязг. Обычно gcc массирует заголовки, чтобы заставить их работать, но это влияет только на системные заголовки, а не на заголовки платформы.
Мне просто интересно, почему вы пытаетесь скомпилировать Objective-C
код, когда Qt
является C++
и, я надеюсь, не зависит от Objective-C
функции.
Других решений пока нет …