2011-08-27 11 views
20

Ho bisogno di sopprimere i flag "-arch x86_64 -arch i386" Waf passa a GCC.Come si eliminano i flag "-arch", "x86_64" durante la compilazione di un'applicazione OpenGL/SDL con Waf su OSX?

Sto costruendo un'applicazione SDL/Opengl. Se collego contro 32 bit runtime SDL ottengo l'errore

Undefined symbols for architecture i386: 
    "_SDL_Quit", referenced from: 
     __del_video in SDL_functions.c.2.o 
     __init_video in SDL_functions.c.2.o 

Se collego contro runtime SDL 64 bit, ottengo l'errore "simboli non definiti per l'architettura x86_64"

Il compilatore è apparentemente usando bandiere

-arch x86_64 -arch i386 

Capisco che questo fa sì che GCC su OSX provi a compilare per entrambe le architetture. Voglio compilare per 64 bit o compilare per 32 bit. Come si sopprimono i flag per un'architettura?

risposta

-1

Non conosco un modo per emettere un comando/flag per sopprimere altri flag. Tuttavia, per compilare solo 64 o 32 bit, è possibile utilizzare -m64 o -m32, rispettivamente. Dato che stai compilando per entrambe le architetture, -m32 potrebbe essere la tua unica opzione perché -m64 non funzionerà con i386.

+0

-m32 non funziona. Aggiunge ancora il flag a 64 bit. Ho dovuto scrivere un comando sed per cambiare i flag a 64 bit in flag a 32 bit in configurazione e ottengo un build a 64 bit. Posso forzarlo a fare solo 64 bit? – HaltingState

+1

Non sono sicuro di averti capito. L'impostazione del flag di arco su x86_64 o i386 indica la famiglia di processori. L'impostazione del flag m64 o m32 indica le istruzioni generate. La famiglia x86_64 può gestire sia le istruzioni a 64 che a 32 bit. Stai dicendo che hai cambiato il flag a 64 bit (quale esattamente?) A 32 bit e hai ottenuto un build a 64 bit? Se si desidera solo 64 bit, non è possibile utilizzare il flag i386. – Jerry

+1

Il problema è che waf sta aggiungendo questi flag non all'utente - e l'utente vuole solo -arch x86_64 – Mark

2

Ho scoperto nel mio caso che le bandiere a doppio arco erano originate here, in particolare da distutils.sysconfig.get_config_var('LDFLAGS'). Restituisce lo LDFLAGS che Python pensa che dovresti collegare i moduli Python con. Nel mio caso, file $(which python) è un "Mach-O universal binary con 2 architetture", quindi Python pensa che dovresti collegarti a -arch x86_64 -arch i386 -Wl,F.

Il mio problema era che stavo creando un modulo nativo Python che doveva collegarsi a Python e un'altra libreria che non è stato costruito con entrambe le arcate. Durante la creazione del mio modulo con entrambe le arcate, il collegamento non è riuscito con "simboli non trovati", poiché entrambi gli archivi non erano disponibili nella libreria di terze parti.

Dal waf unfortunately doesn't allow you to override its computed flags with your own flags, as Automake does, ho potuto risolvere solo che questa scompigliando direttamente con il mio ctx() oggetto nel mio wscript:

for var in ['CFLAGS_PYEMBED', 'CFLAGS_PYEXT', 'CXXFLAGS_PYEMBED', 
    'CXXFLAGS_PYEXT', 'LINKFLAGS_PYEMBED', 'LINKFLAGS_PYEXT']: 
    newvar = [] 
    for ix, arg in enumerate(ctx.env[var]): 
     if '-arch' not in (arg, ctx.env[var][ix - 1]): 
      newvar.append(arg) 
    ctx.env[var] = newvar 

(Questo rimuove tutte le -arch bandiere e le loro argomentazioni delle variabili rilevanti Dal momento che stavo passando anche. il mio flag -arch nel mio CFLAGS, ora non viene sovrascritto.)