2010-04-21 12 views
18

Il codice su cui sto lavorando dovrebbe essere possibile creare sia per ambienti ospitati che indipendenti, fornendo implementazioni private per alcune funzioni stdlib per quest'ultimo caso.Compilare per ambienti indipendenti con GCC

Posso verificarlo in modo affidabile con solo GCC su un normale server workstation/build?

  • Il "-ffreestanding" opzione sembrava promettente, ma sembra che sia "solo" disabilita built-in e imposta la macro STDC_HOSTED correttamente, ancora fornisce tutte le intestazioni di sistema.

  • L'opzione "-nostdinc" è troppo restrittiva; Voglio comunque utilizzare le intestazioni richieste per un'implementazione indipendente (in particolare stddef.h e limits.h).

Cosa mi manca qui?

Oh, e sto usando GCC 4.4.3 per il momento, aggiornerò presto a 4.5.0 ".

+0

Curioso ... perché stai costruendo per freestanding? Stai facendo uno di quei programmi hardcore "/ sbin"? Stai scrivendo un kernel? Ho visto solo "-affermazione" menzionata nel contesto di Linux personalizzato. –

+0

La risposta breve è la domanda del mercato. Alcuni dei nostri clienti sul lato embedded/mobile vogliono che il nostro prodotto sia completamente autonomo. – Christoffer

risposta

18

Bene, dal momento che non è stata data alcuna risposta, potrei anche descrivere come ho fatto questo lavoro. È piuttosto semplice, anche se a seconda del sistema di destinazione può essere noioso.

Utilizzare "-nostdinc" significa che il sistema standard include i percorsi verranno saltati; altri percorsi di inclusione dati con "-I" saranno comunque ricercati per le intestazioni.

Così, per il target di compilazione indipendente creo una cartella 'include-indipendente-C89' e collegare le relative intestazioni di sistema - float.h, iso646.h, limits.h, stdarg .h e stddef.h - lì. Altre intestazioni potrebbero essere incluse in queste, a seconda della piattaforma, quindi potrebbe essere necessario effettuare alcune ricerche e impostare più collegamenti (da qui la noia se è necessario farlo per più piattaforme di destinazione).

La directory C89 può quindi essere utilizzato come base per 'include-indipendente-C99', le intestazioni extra per collegamento sono stdbool.h e stdint.h

La riga di comando da utilizzare è poi

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

o

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