Macos 如何抑制'-拱门';x86_64';在OSX上使用Waf编译OpenGL/SDL应用程序时的标志?
我需要抑制Waf传递给GCC的“-arch x86_64-arch i386”标志 我正在构建一个SDL/Opengl应用程序。如果我链接到32位SDL运行时,我会得到错误Macos 如何抑制'-拱门';x86_64';在OSX上使用Waf编译OpenGL/SDL应用程序时的标志?,macos,opengl,sdl,waf,Macos,Opengl,Sdl,Waf,我需要抑制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 如果
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位。如何抑制一个体系结构的标志?我不知道如何发出命令/标志抑制其他标志。但是,要仅编译64位或32位,可以分别使用-m64或-m32。由于您正在为这两种体系结构进行编译,-m32可能是您唯一的选择,因为-m64不适用于i386。在我的案例中,我发现双拱形标志是源自
distutils.sysconfig.get\u config\u var('LDFLAGS')
。这将返回Python认为应该链接Python模块的LDFLAGS
。在我的例子中,file$(哪个python)
是一个“具有两种体系结构的Mach-O通用二进制文件”,因此python认为您应该链接到-arch x86\u 64-arch i386-Wl,F.
我的问题是,我正在构建一个Python本机模块,该模块需要与Python和另一个库进行链接,而这个库不是同时使用这两个拱门构建的。使用两个拱门构建模块时,链接失败,出现“未找到符号”,因为第三方库中没有这两个拱门
自从waf以来,我只能通过在我的wscript
中直接使用ctx()
对象来解决这个问题:
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
标志及其参数。由于我还在我的CFLAGS
中传递了我自己的-arch
标志,它现在不会被覆盖。)-m32不起作用。它仍然在其中添加64位标志。我必须编写一个sed命令,将配置中的64位标志更改为32位标志,然后得到一个64位构建。我可以强制它只执行64位吗?我不确定我是否理解你的意思。将arch标志设置为x86_64或i386表示处理器系列。设置m64或m32标志表示生成的指令。x86_64系列可以处理64位和32位指令。您是说您将64位标志(确切地说是哪一个?)更改为32位,并获得了64位版本?如果您只需要64位,则可能不使用i386标志。问题是waf添加的是这些标志,而不是用户,并且用户只需要-arch x86_64