c - NSAddImage 的替换(在 GLLoadGen 中)

标签 c macos opengl

使用 GLLoadGen 生成的 GL 加载器包含以下代码:

static void* AppleGLGetProcAddress (const GLubyte *name)
{
  static const struct mach_header* image = NULL;
  NSSymbol symbol;
  char* symbolName;
  if (NULL == image)
  {
    image = NSAddImage("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", NSADDIMAGE_OPTION_RETURN_ON_ERROR);
  }
  /* prepend a '_' for the Unix C symbol mangling convention */
  symbolName = (char*)malloc(strlen((const char*)name) + 2);
  strcpy(symbolName+1, (const char*)name);
  symbolName[0] = '_';
  symbol = NULL;
  /* if (NSIsSymbolNameDefined(symbolName))
     symbol = NSLookupAndBindSymbol(symbolName); */
  symbol = image ? NSLookupSymbolInImage(image, symbolName, NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR) : NULL;
  free(symbolName);
  return symbol ? NSAddressOfSymbol(symbol) : NULL;
}

这个函数显然加载了 OpenGL 函数 name 的地址。但是调用NSAddImage and related自 OSX 10.5 起已弃用。当前(未弃用)加载函数地址的方法是什么?

最佳答案

dlopen() , dlsym()和 friend 可能是最好的选择。这也将使您的代码更具可移植性,因为它们也适用于大多数 Unix 系统。

以下是我过去用于在 Mac OSX 上加载 GL 函数的一些代码(在 10.8 版上测试过,对于 Mavericks 应该仍然可以正常工作):

// Handle to the OpenGL dynlib:
static void * glLibrary;

// Path to GL on OSX. True for version 10.8.
static const char * glLibPath = "/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL";

// Loads the OpenGL library:
void LoadGL()
{
    // Load GL dynlib:
    glLibrary = dlopen(glLibPath, RTLD_LAZY);

    if (!glLibrary)
    {
        const char * error = dlerror();
        // handle error
    }
}

// Unloads the GL library:
void UnloadGL()
{
    if (glLibrary)
    {
        if (dlclose(glLibrary) != 0)
        {
            // problem...
        }
        glLibrary = NULL;
    }
}

// Grab a function pointer form the previously loaded GL library:
void * GetGLFunctionPointer(const char * funcName)
{
    assert(funcName != NULL);
    assert(glLibrary != NULL && "OpenGL dynlib not yet loaded!");
    return dlsym(glLibrary, funcName);
}

// Usage example:

int main()
{
    LoadGL();

    void * fn = GetGLFunctionPointer("glEnable");
    assert(fn != NULL);

    UnloadGL();

    return 0;
}

关于c - NSAddImage 的替换(在 GLLoadGen 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25089760/

相关文章:

c++ - 重用 opengl 纹理

c++ - GLFW 第一响应者错误

c++ - 以编程方式从 Unix 中的用户名获取 UID 和 GID?

c - 方法的位标志参数如何工作(Ansi C/C)?

python - 使用python打开设备进行原始写入

xcode - "Operation not permitted"在mac app中执行shell脚本时

c++ - OpenGL 地形碰撞检测

CS50 helpers.c,代码未找到值(value)(针)?有任何想法吗?

c - 如何从 C 程序读取 .txt 文件或 .csv 文件?

python - 以编程方式在 Python 中提示时输入密码?