Как подавить флаги '-arch', 'x86_64' при компиляции приложения OpenGL / SDL с Waf на OSX? - PullRequest
21 голосов
/ 27 августа 2011

Мне нужно подавить флаги "-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 ]

2 голосов
/ 16 апреля 2015

В моем случае я обнаружил, что флаги с двойной аркой начинаются здесь , в частности, с distutils.sysconfig.get_config_var('LDFLAGS'). Это возвращает LDFLAGS, с которым Python считает, что вы должны связать модули Python. В моем случае file $(which python) - это «универсальный двоичный файл Mach-O с 2 архитектурами», поэтому 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, теперь он не переопределяется.)

0 голосов
/ 28 сентября 2011

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

...