我试图使用
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
完整的源文件可以在这里找到。
所以,我认为我的问题得到了充分解答。
我以为我的问题是关于“1”指针,但它正在深入研究 MacOS 上的 OpenGL 内容。
感谢 Ian Abbott 在评论中提供解决方案。