¿Cómo suprimo las marcas '-arch', 'x86_64' al compilar una aplicación OpenGL / SDL con Waf en OSX?

Necesito suprimir los indicadores "-arch x86_64 -arch i386" que Waf está pasando a GCC.

Estoy construyendo un SDL / Opengl solicitud. Si me vinculo con el tiempo de ejecución de SDL de 32 bits, aparece un error

    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

Si me vinculo con el tiempo de ejecución de SDL de 64 bits, aparece el error "Símbolos no definidos para la arquitectura x86_64"

El compilador aparentemente está usando banderas

-arch x86_64 -arch i386

Entiendo que esto hace que GCC en OSX intente compilar para ambas arquitecturas. Quiero compilar para 64 bits o compilar para 32 bits. ¿Cómo suprimo las banderas de una arquitectura?

preguntado el 27 de agosto de 11 a las 18:08

2 Respuestas

Descubrí en mi caso que las banderas de doble arco se originaban aquí, específicamente de distutils.sysconfig.get_config_var('LDFLAGS'). Esto devuelve el LDFLAGS con el que Python cree que debería vincular los módulos de Python. En mi caso, file $(which python) es un "binario universal Mach-O con 2 arquitecturas", por lo que Python cree que debería vincularlo con -arch x86_64 -arch i386 -Wl,F.

Mi problema era que estaba construyendo un módulo nativo de Python que necesitaba vincularse con Python y otra biblioteca que no estaba construida con ambos arcos. Al construir mi módulo con ambos arcos, la vinculación falló con "símbolos no encontrados", porque ambos arcos no estaban disponibles en la biblioteca de terceros.

Desde waf desafortunadamente no le permite anular sus indicadores calculados con sus propios indicadores, como lo hace Automake, Solo pude solucionar este problema jugando directamente con mi ctx() objeto en mi 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

(Esto elimina todo -arch banderas y sus argumentos de las variables relevantes. Ya que yo también estaba pasando el mío -arch bandera en mi CFLAGS, ahora no se anula).

Respondido 16 Abr '15, 08:04

No conozco una forma de emitir un comando / bandera para suprimir otras banderas. Sin embargo, para compilar solo para 64 o 32 bits, puede usar -m64 o -m32, respectivamente. Dado que está compilando para ambas arquitecturas, -m32 podría ser su única opción porque -m64 no funcionará para i386.

Respondido el 28 de Septiembre de 11 a las 09:09

-m32 no funciona. Todavía agrega la bandera de 64 bits allí. Tuve que escribir un comando sed para cambiar los indicadores de 64 bits a indicadores de 32 bits en la configuración y obtengo una compilación de 64 bits. ¿Puedo forzarlo a que solo haga 64 bits? - Estado de detención

No estoy seguro de entenderte. Establecer la bandera de arco en x86_64 o i386 significa la familia de procesadores. Establecer el indicador m64 o m32 significa las instrucciones generadas. La familia x86_64 puede manejar instrucciones de 64 y 32 bits. ¿Estás diciendo que cambiaste la bandera de 64 bits (¿cuál exactamente?) A 32 bits y obtuviste una compilación de 64 bits. Si solo desea 64 bits, no puede usar el indicador i386. - alemán

El problema es que waf está agregando estas banderas, no el usuario, y el usuario solo quiere el -arch x86_64 - mmmmmm

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.