我需要压制“-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位。如何抑制一个架构的标志?
答案 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。