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

21
HaltingState 27 Авг 2011 в 22:43

2 ответа

Лучший ответ

Я не знаю, как использовать команду / флаг для подавления других флагов. Однако для компиляции только для 64 или 32 бит вы можете использовать -m64 или -m32 соответственно. Поскольку вы компилируете для обеих архитектур, -m32 может быть вашим единственным вариантом, потому что -m64 не будет работать для i386.

0
Jerry 28 Сен 2011 в 05:48

В моем случае я обнаружил, что флаги с двойной аркой исходят от здесь, в частности от 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, теперь он не переопределяется.)

2
ptomato 16 Апр 2015 в 05:40