Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何抑制'-拱门';x86_64';在OSX上使用Waf编译OpenGL/SDL应用程序时的标志?_Macos_Opengl_Sdl_Waf - Fatal编程技术网

Macos 如何抑制'-拱门';x86_64';在OSX上使用Waf编译OpenGL/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 如果

我需要抑制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位。如何抑制一个体系结构的标志?

我不知道如何发出命令/标志抑制其他标志。但是,要仅编译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