21

我需要抑制 Waf 传递给 GCC 的“-arch x86_64 -arch i386”标志。

我正在构建一个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 位。如何抑制一种架构的标志?

4

2 回答 2

2

我发现在我的案例中,双拱标志起源于这里,特别是来自distutils.sysconfig.get_config_var('LDFLAGS'). 这将返回LDFLAGSPython 认为您应该链接 Python 模块的那个。就我而言,file $(which python)是“具有 2 个架构的 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标志及其参数。由于我还在 my 中传递了我自己的-arch标志CFLAGS,因此它现在不会被覆盖。)

于 2015-04-16T05:40:49.237 回答
0

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

于 2011-09-28T05:48:41.717 回答