You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Libretro框架库路径获取问题:readlink返回调用方可执行文件路径

解决Libretro核心库获取自身路径的问题

嘿,我之前开发Libretro核心的时候也踩过这个坑!用readlink拿到的是前端(比如RetroArch)可执行文件的路径,这是因为Libretro核心是被前端动态加载的,系统层面的路径获取方法只会追踪到加载它的进程路径,而不是核心库本身的位置。

不过别担心,Libretro框架本身就提供了官方的解决方案,专门用来获取核心库的路径:

正确的实现步骤

Libretro的环境回调API里有RETRO_ENVIRONMENT_GET_CORE_PATH这个请求类型,前端会主动把核心库的完整路径传递给你。具体实现如下:

  1. 先保存环境回调指针
    在你的核心代码里,一定要在retro_set_environment函数中保存retro_environment_t类型的回调指针,这是后续请求路径的关键:

    static retro_environment_t environment_cb;
    
    void retro_set_environment(retro_environment_t cb) {
        environment_cb = cb;
    }
    
  2. 请求核心库路径
    在retro_init或者其他初始化逻辑中,通过环境回调请求核心路径:

    #include <retro.h>
    #include <string.h>
    #include <limits.h> // 定义PATH_MAX
    
    static char core_directory[PATH_MAX];
    
    void retro_init(void) {
        char core_path[PATH_MAX];
        struct retro_variable path_var;
        
        path_var.key = "core_path";
        path_var.value = core_path;
    
        // 发送获取核心路径的请求
        if (environment_cb(RETRO_ENVIRONMENT_GET_CORE_PATH, &path_var)) {
            // 从完整路径中提取目录部分
            char* last_slash = strrchr(core_path, '/');
            if (last_slash != NULL) {
                // 截断文件名,只保留目录
                strncpy(core_directory, core_path, last_slash - core_path + 1);
                core_directory[last_slash - core_path + 1] = '\0';
            }
        }
    }
    
  3. 使用目录路径打开文件
    现在core_directory就是你的library.so所在的目录,你可以直接用它拼接要打开的文件路径,比如:

    char config_path[PATH_MAX];
    snprintf(config_path, sizeof(config_path), "%s/config.ini", core_directory);
    // 接下来就可以打开config_path对应的文件了
    

注意事项

  • 不同平台的路径分隔符可能不同(Windows是\),如果需要跨平台兼容,可以用Libretro提供的路径处理工具函数(比如retro_dirname),避免手动处理分隔符出错。
  • 确保PATH_MAX被正确定义,如果你的系统没有这个宏,可以手动定义一个足够大的值(比如#define PATH_MAX 4096)。
  • 这个方法是Libretro官方推荐的,比系统级的readlink或者GetModuleFileName更可靠,因为前端会统一处理不同平台的路径逻辑。

内容的提问来源于stack exchange,提问作者Morgoth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:06:27