2010-04-21 2 views
18

Предполагается, что код, над которым я работаю, можно создавать как для размещенных, так и для автономных сред, обеспечивая частные реализации некоторых функций stdlib для последнего случая.Компиляция для автономной среды с GCC

Могу ли я надежно проверить это с помощью GCC на обычном сервере рабочей станции/сборки?

  • «-ffreestanding» вариант выглядит многообещающим, но мне кажется, что это «только» отключает встроенные модули и устанавливает макрос STDC_HOSTED должным образом, он по-прежнему обеспечивает все заголовки системы.

  • Опция «-nostdinc» является слишком ограничительной; Я все еще хочу использовать заголовки, необходимые для самостоятельной реализации (в частности, stddef.h и limits.h).

Что мне здесь не хватает?

О, и я использую GCC 4.4.3 на данный момент, обновится до 4.5.0 «скоро».

+0

Любопытный ... почему вы строите для отдельно стоящих? Вы делаете одну из этих хардкорных программ «/ sbin»? Вы пишете ядро? Я видел только «-ffreestanding», упомянутый в контексте пользовательского Linux. –

+0

Короткий ответ - спрос на рынке. Некоторые наши клиенты со встроенной/мобильной стороны хотят, чтобы наш продукт был полностью автономным. – Christoffer

ответ

18

Ну, так как ответа не дано, я мог бы также описать, как я сделал эту работу. Это довольно просто, хотя в зависимости от целевой системы это может быть утомительным.

Использование «-nostdinc» означает, что стандартная система включает пути, которые будут пропускаться; другие include-paths, заданные с «-I», конечно, будут по-прежнему искать заголовки.

Таким образом, для цели отдельно стоящей сборки создать папку 'include-свободностоящая-c89' и связать соответствующие системные заголовки - float.h, iso646.h, limits.h, stdarg .h и stddef.h - там. Другие заголовки могут быть включены в них, в зависимости от вашей платформы, поэтому вам, возможно, придется провести какое-то исследование и установить дополнительные ссылки (отсюда утомительность, если вам нужно сделать это для нескольких целевых платформ).

Каталог C89 может быть использован в качестве основы для «включают в себя, отдельно стоящим-C99», дополнительные заголовки для ссылки являются stdbool.h и stdint.h

Командная строка для использования в затем

gcc -std=c89 -nostdinc -nostdlib -ffreestanding -I include-freestanding-c89 

или

gcc -std=c99 -nostdinc -nostdlib -ffreestanding -I include-freestanding-c99 
Смежные вопросы