Как скомпилировать стандартную библиотеку c11 на OS X с помощью clang?

Эй, я пытаюсь скомпилировать код c, который использует функции из стандартной библиотеки c11 в OS X с clang.

Опция компилятора -std=c11 позволяет мне использовать возможности языка c11. Но когда я использую новые функции, такие как at_quick_exit, я получаю следующее предупреждение implicit declaration of function 'at_quick_exit' is invalid in C99.

В исходном коде есть следующая строка #include <stdlib.h> Вариант clang -stdlib не помогает.

Мои системы:

ОС Х Йосемити 10.10.3

$ clang -v
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.3.0
Thread model: posix

Убунту 14.04 ЛТС

$ clang -v
Ubuntu clang version 3.4-1ubuntu3 (tags/RELEASE_34/final) (based on LLVM 3.4)
Target: x86_64-pc-linux-gnu 
Thread model: posix

Чтобы быть более явным. Как я могу получить в OS X стандартную библиотеку c11?

Спасибо за любую помощь.


person aiq    schedule 23.05.2015    source источник
comment
есть ли в исходном коде, вызывающем функцию at_quick_exit, строка: #include ‹stdlib.h›?   -  person user3629249    schedule 24.05.2015
comment
На другие вопросы stackoverflow есть ответы, указывающие на то, что «quick_exit()» не реализован в OSX. В моей системе Ubuntu 14.04 нет функций «quick_exit()» и «at_quick_exit()»! Обе они будут функциями системного уровня. Предложите использовать «exit()» и «atexit()» для достижения той же функциональности.   -  person user3629249    schedule 24.05.2015


Ответы (1)


Обычно самостоятельный системный компилятор сам по себе не обеспечивает полную стандартную среду C, включая библиотеки времени выполнения. Обычно базовая система предоставляет большинство, если не все, библиотек (и заголовков), в то время как компилятор просто компилирует.

Таким образом, если вам нужны некоторые специфические функции, которые не предусмотрены в данной системе, вам придется написать их самостоятельно или получить их из какой-либо переносимой библиотеки, совместимой с вашей целевой системой.

В этом конкретном случае вы также, вероятно, обнаружите, что сама quick_exit() не предоставляется системной libc, поэтому достаточно легко написать обе функции самостоятельно.

person Greg A. Woods    schedule 23.05.2015
comment
Если foo — это имя стандартизированной функции, писать свою собственную функцию с именем foo — поведение неопределенное, поэтому я бы посоветовал не вызывать две функции со стандартными именами. - person Pascal Cuoq; 26.05.2015
comment
Это благовидный аргумент. В стандарте нет ничего волшебного, что может вызвать проблемы в реальном мире — если он работает, он работает, а если он делает код совместимым с будущими средами, то еще лучше. В идеале, конечно, замена будет в отдельной единице компиляции и будет выбрана системой сборки только в том случае, если цель еще не имеет стандартной реализации. - person Greg A. Woods; 26.05.2015