2009-10-17 5 views
5

Questo fa parte di una serie di almeno due domande strettamente correlate, ma distinte. Spero di fare la cosa giusta chiedendoli separatamente.Creazione dell'app Visual C++ che non utilizza le funzioni CRT fa ancora riferimento ad alcuni

Sto cercando di far funzionare l'app Visual C++ 2008 senza la libreria di runtime C. Si tratta di un'app GUI Win32 senza MFC o altro materiale di fantasia, semplicemente l'API di Windows.

Così ho impostato Proprietà progetto -> Configurazione -> C/C++ -> Avanzate -> Ometti nomi libreria predefiniti su Sì (flag di compilazione /Zl) e ricostruito. Supponiamo di aver scritto una funzione di punto di ingresso adeguata, che è l'oggetto di my other question.

Ottengo due errori di linker; sono probabilmente correlati. Il linker si lamenta di simboli esterni non risolti __fltused e _memcpy in foobar.obj. Inutile dire che non uso nè esplicitamente nel mio programma, ma io uso memcpy da qualche parte in foobar.cpp. (Avrei usato CopyMemory ma che si rivela essere #define d essere identico a memcpy ...)

(pensavo di poter sbarazzarsi del problema memcpy utilizzando un compilatore intrinseca, come #pragma intrinsic(memcpy), ma questo rende nessuna differenza.)

Se guardo l'uscita del preprocessore (aggiungendo /P alla riga di comando del compilatore), non vedo alcun riferimento a uno o __fltused_memcpy in foobar.i.

Quindi, la mia domanda è: Da dove vengono questi errori del linker e come li risolvo?

+0

E la tua domanda è? –

+0

Ah ... devo averlo perso in qualche modo mentre dividevo questa cosa in due. Ri-aggiunto, grazie! – Thomas

risposta

8

__fltused implica che si sta utilizzando o almeno ha dichiarato alcuni caratteri mobili o doppi. Il compilatore inietta questo simbolo 'inutile' per causare un supporto flottante .obj per essere caricato dal crt. È possibile ottenere intorno a questo semplicemente dichiarando un simbolo con il nome

#ifdef __cplusplus 
extern "C" { 
#endif 
int __fltused=0; 
#ifdef __cplusplus 
} 
#endif 

WRT _memcpy - memcpy è una funzione __cdecl, e tutte le funzioni cdecl ottenere un automatico _ come parte della loro decorazione. quindi, quando dici "__cdecl memcpy" - il linker del compilatore & cerca un simbolo chiamato "_memcpy". Le funzioni intrinseche - anche se esplicitamente richieste - possono ancora essere importate se le impostazioni di costruzione hanno impostazioni di debug che indicano controindicazioni intrinseche. Quindi, a un certo punto, dovrai implementare la tua memcpy e le relative funzioni.

+0

Grazie per la rapida risposta! Sfortunatamente, il trucco '__fltused' sembra non fare nulla per me. Metto 'int __fltused = 0;' all'inizio di 'foobar.cpp'; statico o non statico non fa la differenza neanche. – Thomas

+0

Inoltre, sono abbastanza sicuro che non utilizzerò alcun float o doppio in nessun luogo. Il mio albero dei sorgenti non contiene queste parole. – Thomas

+0

Ah, avvolgendolo in "extern" C "' ha fatto il trucco. Grazie! – Thomas

0

Si consiglia di impostare l'opzione di compilazione "elenco assembly" (o alcuni di essi) per foobar.cpp una volta e quindi di ispezionare il codice assembler. Questo dovrebbe veramente dirti dove questi simboli sono usati.

+0

Non sono esattamente un guru di assemblatori x86. Ma se riesco a trovare gli strumenti, potrei fare una prova domani. – Thomas

Problemi correlati