Мне нужно подавить флаги «-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, я получаю ошибку «Неопределенные символы для архитектуры x86_64»
Компилятор явно использует флаги
-arch x86_64 -arch i386
Я понимаю, что это заставляет GCC на OSX пытаться скомпилировать для обеих архитектур. Я хочу либо скомпилировать для 64-разрядной версии, либо для 32-разрядной версии. Как подавить флаги для одной архитектуры?
2 ответа
Я не знаю, как использовать команду / флаг для подавления других флагов. Однако для компиляции только для 64 или 32 бит вы можете использовать -m64 или -m32 соответственно. Поскольку вы компилируете для обеих архитектур, -m32 может быть вашим единственным вариантом, потому что -m64 не будет работать для i386.
В моем случае я обнаружил, что флаги с двойной аркой исходят от здесь, в частности от 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 , я мог исправить это только напрямую с моим объектом 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
, теперь он не переопределяется.)
Похожие вопросы
Новые вопросы
macos
macOS (ранее известная как OS X или Mac OS X) - это операционная система для настольных ПК от Apple, установленная на компьютерах Macintosh. Используйте этот тег только в том случае, если ваш вопрос касается использования API-интерфейсов macOS или поведения, специфичного для macOS, а не потому, что вы запускаете свой код в macOS. Вопросы, связанные с использованием или устранением неполадок macOS, не относятся к теме и принадлежат сообществу «Спроси другое».