Я использую 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
Кто-нибудь знает, что может вызвать эту проблему?
Я ценю любую помощь
Обновление OSX Mavericks уничтожит несколько каталогов установки XCode. Чтобы восстановить их, вам необходимо переустановить инструменты командной строки XCode.
xcode-select --install
Затем согласитесь на приглашение к загрузке.
Если это не помогло, вы можете попробовать установить его вручную здесь: OSX: загрузка Xcode
Это не относится к неправильно установленным инструментам osx cmdline, но, как ясно объяснено в этот ТАК вопрос, некоторые встроенные макросы изменены в 10.9 заголовках SDK, в частности в usr / include / sys / cdefs.h.
В качестве быстрого обходного пути вы можете использовать механизмы GCC «фиксированное включение» и предоставить слегка измененную версию /usr/include/sys/cdefs.h, которая предотвращает проблему при компиляции кода на С ++ следующим образом:
Отредактируйте только что скопированный файл …. / 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 и, следовательно, оставит зависимость времени ссылки от символа, то есть он попытается найти его в некоторой библиотеке, что приведет к ошибке ссылки.
Может быть, вы только установили 32-битную часть GCC? Попробуйте -m32.
Я пытался переустановить инструменты командной строки Xcode, так как вчера использовал
xcode-select --install
К сожалению это тоже не работает
Но тогда я смог получить его от
https://developer.apple.com/downloads/index.action
К сожалению, переустановка инструментов командной строки тоже не помогла 🙁
Я думаю, я не пойду с
clang++ -std=c++11 -stdlib=libc++
пока не будет официального решения.