macos opengl sdl waf

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



(2)

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

Estoy construyendo una aplicación SDL / Opengl . Si me vinculo con el tiempo de ejecución SDL de 32 bits, obtengo 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 vinculo con el tiempo de ejecución SDL de 64 bits, aparece el error "Símbolos no definidos para la arquitectura x86_64"

El compilador está aparentemente 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 para una arquitectura?


Descubrí en mi caso que las banderas de doble arco se originaban here , específicamente de distutils.sysconfig.get_config_var(''LDFLAGS'') . Esto devuelve los LDFLAGS que Python cree que debería vincular los módulos de Python. En mi caso, el file $(which python) es un "binario universal Mach-O con 2 arquitecturas", por lo que Python cree que debería vincularse 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 compilar mi módulo con ambos arcos, el enlace falló con "símbolos no encontrados", porque ambos arcos no estaban disponibles en la biblioteca de terceros.

Como desafortunadamente, waf no le permite anular sus banderas calculadas con sus propias banderas, como lo hace Automake , solo pude arreglar esto al jugar directamente con mi objeto ctx() 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 todas -arch banderas -arch y sus argumentos de las variables relevantes. Como también pasé mi propia bandera -arch en mi CFLAGS , ahora no se anula).


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