Подтвердить что ты не робот

Как подавить флаги "-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 бит. Как подавить флаги для одной архитектуры?

4b9b3361

Ответ 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, он теперь не становится переопределенным.)