Ошибка MacPorts GCC 4.8.2 с заголовками mmacosx-version-min и Foundation

Я использую 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 позволяет записывать атрибуты на отдельных счетчиках. Это позволяет использовать перечислители как устаревшие, сделать их недоступными и т. Д. Атрибут должен появляться после имени перечислителя и перед любым инициализатором.

1

Решение

У вас возникла проблема при попытке использовать заголовки фреймворка с gcc-4.8. На что он жалуется, так это на атрибут перечислителя, например,

enum foo {
foo_alice = 1,
foo_bob = 2,
foo_carol __attribute__((deprecated)) = 3
};

но gcc не поддерживает это; его расширение лязг. Обычно gcc массирует заголовки, чтобы заставить их работать, но это влияет только на системные заголовки, а не на заголовки платформы.

Мне просто интересно, почему вы пытаетесь скомпилировать Objective-C код, когда Qt является C++и, я надеюсь, не зависит от Objective-C функции.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]