Как подавить флаги "-arch", "x86_64" при компиляции приложения OpenGL/SDL с помощью Waf на OSX?
Мне нужно подавить флаги "-arch x86_64 -arch i386". Waf переходит в GCC.
Я создаю приложение SDL/Opengl. Если я связываюсь с 32-разрядной версией SDL, я получаю ошибку
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
Если я свяжусь с 64-битной версией SDL, я получаю сообщение об ошибке "Undefined для архитектуры x86_64"
Компилятор, по-видимому, использует флаги
-arch x86_64 -arch i386
Я понимаю, что это приводит к тому, что GCC на OSX пытается скомпилировать для обеих архитектур. Я хочу либо скомпилировать для 64 бит, либо компилировать для 32 бит. Как подавить флаги для одной архитектуры?
Ответы
Ответ 1
Я не знаю, как выпустить команду/флаг для подавления других флагов. Однако для компиляции только для 64 или 32 бит вы можете использовать -m64 или -m32, соответственно. Поскольку вы компилируете для обеих архитектур, -m32 может быть вашим единственным вариантом, потому что -m64 не будет работать для i386.
Ответ 2
В моем случае я обнаружил, что двойные флаговые флаги создаются здесь, в частности от distutils.sysconfig.get_config_var('LDFLAGS')
. Это возвращает LDFLAGS
, что Python считает, что вы должны связывать модули Python. В моем случае file $(which python)
является "универсальным двоичным файлом Mach-O с двумя архитектурами", поэтому Python считает, что вы должны ссылаться на -arch x86_64 -arch i386 -Wl,F.
Моя проблема заключалась в том, что я создавал собственный модуль Python, который должен был связываться с Python и другой библиотекой, которая не была построена с обеих дуг. При создании моего модуля с обеими дугами ссылка не удалась с "символами, которые не были найдены", поскольку обе арки не были доступны в сторонней библиотеке.
Так как waf к сожалению, не позволяет вам переопределять свои вычисленные флаги своими собственными флагами, так как Automake делает, я мог бы исправить это только messing непосредственно с моим объектом ctx()
в моем 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
(Это удаляет все флаги -arch
и их аргументы из соответствующих переменных. Так как я также передавал свой собственный флаг -arch
в моем CFLAGS
, он теперь не становится переопределенным.)