macOS 上奇怪的函数指针行为

问题描述 投票:0回答:1

我试图使用

dlsym
动态加载OpenGL函数。在 Linux 上,它按其应有的方式工作 - 返回指向该函数的指针,然后将其转换为函数本身。

但是在 macOS 上,会返回一个指针,并且在强制转换后它会变成 1。此后,与该函数的任何交互都会导致错误。

代码如下所示。部分取自 GLAD。

#include <iostream>
#include <dlfcn.h>

// GL types
typedef unsigned int GLenum;
typedef int GLsizei;
typedef unsigned int GLuint;
typedef int GLint;

// GL library instance
static void* libGL;

static void* a_GetProcAddress(const char* name) {
    if(libGL == NULL){ 
        // Only for macOS
        static const char *NAMES[] = {
            "../Frameworks/OpenGL.framework/OpenGL",
            "/Library/Frameworks/OpenGL.framework/OpenGL",
            "/System/Library/Frameworks/OpenGL.framework/OpenGL",
            "/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL"
        };
        for(int i = 0; i < 4; i++)
            if((libGL = dlopen(NAMES[i], RTLD_LOCAL)) != NULL)
                break;
    }
    return dlsym(libGL, name);
}

它的用法是这样的:

// GL function definitions
typedef void (*GLVIEWPORTPROC)(GLint x, GLint y, GLsizei width, GLsizei height);
GLVIEWPORTPROC a_glViewport;

int main(){
    a_glViewport = (GLVIEWPORTPROC)a_GetProcAddress("glViewport");

    std::cout << a_GetProcAddress("glViewport") << std::endl
              << (GLVIEWPORTPROC)a_GetProcAddress("glViewport") << std::endl
              << a_glViewport << std::endl;
}


// Prints:
// a_GetProcAddress("glViewport")                 == 0x7fff6b90f946
// (GLVIEWPORTPROC)a_GetProcAddress("glViewport") == 1
// a_glViewport                                   == 1

完整的源文件可以在这里找到。

c macos pointers opengl
1个回答
0
投票

所以,我认为我的问题得到了充分解答。

我以为我的问题是关于“1”指针,但它正在深入研究 MacOS 上的 OpenGL 内容。

感谢 Ian Abbott 在评论中提供解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.