在OSX上使用Waf编译OpenGL / SDL应用程序时如何禁止'-arch','x86_64'标志?

时间:2011-08-27 18:43:16

标签: macos opengl sdl waf

我需要压制“-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

据我所知,这会导致OSX上的GCC尝试为两种架构进行编译。我想编译为64位,或编译为32位。如何抑制一个架构的标志?

2 个答案:

答案 0 :(得分:2)

我发现在我的情况下,双拱标志来自here,特别是来自distutils.sysconfig.get_config_var('LDFLAGS')。这将返回Python认为您应该链接Python模块的LDFLAGS。就我而言,file $(which python)是一个“具有2个架构的Mach-O通用二进制文件”,因此Python认为你应该与-arch x86_64 -arch i386 -Wl,F.链接

我的问题是我正在构建一个需要链接Python的Python本机模块和另一个不是用两个构建的库。使用两个拱形构建我的模块时,链接失败并显示“未找到符号”,因为这两个拱在第三方库中不可用。

自waf unfortunately doesn't allow you to override its computed flags with your own flags, as Automake does以来,我只能通过直接弄乱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标志,现在它不会被覆盖。)

答案 1 :(得分:0)

我不知道发布命令/标志来抑制其他标志的方法。但是,要仅编译64位或32位,可以分别使用-m64或-m32。由于您正在为两种体系结构进行编译,因此-m32可能是您唯一的选择,因为-m64不适用于i386。