C ++ 11 — Что-то странное случилось с C ++ 11 в Mavericks?

Я использую gcc 4.8, установленный через MacPorts, и старый код C ++ 11 больше не будет компилироваться

если я использую компилятор без флага -std = c ++ 11, он отлично работает с этим тестовым кодом

#include <cctype>

int main() {
std::isalnum('c');
return 0;
}[bash] g++48 test.cpp

Но после обновления Mavericks я получаю следующую ошибку компиляции:

[bash] g++48 -std=c++11  test.cpp

Undefined symbols for architecture x86_64:
"isalnum(int)", referenced from:
_main in ccvsKeqJ.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

Кто-нибудь знает, что может вызвать эту проблему?
Я ценю любую помощь

3

Решение

Обновление OSX Mavericks уничтожит несколько каталогов установки XCode. Чтобы восстановить их, вам необходимо переустановить инструменты командной строки XCode.

xcode-select --install

Затем согласитесь на приглашение к загрузке.

Если это не помогло, вы можете попробовать установить его вручную здесь: OSX: загрузка Xcode

5

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

Это не относится к неправильно установленным инструментам osx cmdline, но, как ясно объяснено в этот ТАК вопрос, некоторые встроенные макросы изменены в 10.9 заголовках SDK, в частности в usr / include / sys / cdefs.h.

В качестве быстрого обходного пути вы можете использовать механизмы GCC «фиксированное включение» и предоставить слегка измененную версию /usr/include/sys/cdefs.h, которая предотвращает проблему при компиляции кода на С ++ следующим образом:

  1. Найдите, где установлен ваш GCC, я буду использовать GCCROOT
  2. mdkir $ GCCROOT / lib / gcc / x86_64-apple-darwinXXX / 4.X.Y / include-fixed / sys (где darwinXXX зависит от того, где вы скомпилировали GCC, а 4.X.Y — это скомпилированная версия GCC)
  3. Отредактируйте только что скопированный файл …. / include-fixed / sys / cdefs.h, чтобы применить следующий патч:

    @@ -216,7 +215,7 @@
    
    #if __STDC_VERSION__ >= 199901L && (!defined(__GNUC__) || defined(__clang__))
    # define __header_inline           inline
    -#elif defined(__GNUC__) && defined(__GNUC_STDC_INLINE__)
    +#elif defined(__GNUC__) && defined(__GNUC_STDC_INLINE__) && !defined (__cplusplus)
    # define __header_inline           extern __inline __attribute__((__gnu_inline__))
    #elif defined(__GNUC__)
    # define __header_inline           extern __inline
    

Это вызывает, при компиляции кода C ++, расширение

__header_inline -> extern __inline

вместо

__header_inline -> extern __inline __attribute __ ((__ gnu_inline__))

что, очевидно, приведет к тому, что GCC не будет действительно встроенным isalnum и, следовательно, оставит зависимость времени ссылки от символа, то есть он попытается найти его в некоторой библиотеке, что приведет к ошибке ссылки.

5

Может быть, вы только установили 32-битную часть GCC? Попробуйте -m32.

0

Я пытался переустановить инструменты командной строки Xcode, так как вчера использовал
xcode-select --install
К сожалению это тоже не работает

введите описание изображения здесь

введите описание изображения здесь

Но тогда я смог получить его от
https://developer.apple.com/downloads/index.action

К сожалению, переустановка инструментов командной строки тоже не помогла 🙁

Я думаю, я не пойду с

clang++ -std=c++11 -stdlib=libc++

пока не будет официального решения.

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