gpt4 book ai didi

gcc - 错误仅在使用 -O3 编译时出现

转载 作者:行者123 更新时间:2023-12-01 04:07:31 25 4
gpt4 key购买 nike

在使用 GLFW 和 Cython 制作 OpenGL 工具包时,我偶然发现了一个非常非常奇怪的问题。我创建了以下文件 pxd 文件(非常大,所以我给出了它):
https://gist.github.com/1441970
接下来我有这个包装代码(非常简化以显示问题的核心)。
pygrafix.window 模块:

from pygrafix.c_headers.glfw cimport * # this is the pxd file

glfwInit()

_window = None

cdef void _mouse_scroll_callback_handler(int pos):
if _window._mouse_scroll_callback:
_window._mouse_scroll_callback(_window, pos)

cdef class Window:
cdef public object _mouse_scroll_callback

def __cinit__(self):
global _window
self._mouse_scroll_callback = None

_window = self

def __init__(self, int width = 0, int height = 0):
glfwOpenWindow(width, height, 0, 0, 0, 0, 0, 0, GLFW_WINDOW)
glfwSetMouseWheelCallback(<GLFWmousewheelfun> &_mouse_scroll_callback_handler)
print("TEST LOCATION ONE")

def is_open(self):
return glfwGetWindowParam(GLFW_OPENED)

def flip(self):
glfwSwapBuffers()

def set_mouse_scroll_callback(self, func):
self._mouse_scroll_callback = func
而这个主文件:
from pygrafix import window

window = window.Window(800, 600)
print("TEST LOCATION TWO")

def on_scroll(window, pos):
print(pos)

window.set_mouse_scroll_callback(on_scroll)

while window.is_open():
window.flip()
最后我像这样编译它:
cython.py -o pygrafix/window.cy.c pygrafix/window.pyx
gcc -O3 -shared -DGLFW_DLL -IC:\Python27\include pygrafix/window.cy.c -o pygrafix/window.pyd -LC:\Python27\libs -lpython27 -lgfwldll
但它崩溃了(windows 说程序中有错误)。当我注释掉对 glfwSetMouseWheelCallback 的调用时它不会崩溃。
奇怪的是,如果我用 -O0 编译它不会崩溃并且可以正常工作! 我对此完全感到困惑。我检查了 cython 输出的 C 代码,看起来没问题。 _mouse_scroll_callback_handlervoid (*)(int) 类型,并且指向它的指针很好地传递给glfw。
其他怪事:
  • 这只发生在 glfwSetMouseWheelCallback (或者至少对我来说),例如 glwSetMousePosCallback 不是。
  • 如果我将 NULL 传递给 glfwSetMouseWheelCallback , 没有问题。
  • 即使发生崩溃,TEST LOCATION ONE 仍然会被打印,但 TEST LOCATION 2 不会。
  • 如果我用 -O3 -pg
  • 编译它也可以工作

    这可能是什么原因,正确的修复方法是什么(无需在 -O0 编译)?

    其他琐事:
    我在 MinGW 和 CPython 2.7.2 下使用 Windows 7 64 位、GLFW 2.7.2、Cython 0.15.1、GCC 4.6.1。

    最佳答案

    我终于找到了解决方案。问题是我没有添加 __stdcall在 Cython 中到回调函数,我也不知道它支持这个。

    关于gcc - 错误仅在使用 -O3 编译时出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8412277/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com