Libretro框架库路径获取问题:readlink返回调用方可执行文件路径
解决Libretro核心库获取自身路径的问题
嘿,我之前开发Libretro核心的时候也踩过这个坑!用readlink拿到的是前端(比如RetroArch)可执行文件的路径,这是因为Libretro核心是被前端动态加载的,系统层面的路径获取方法只会追踪到加载它的进程路径,而不是核心库本身的位置。
不过别担心,Libretro框架本身就提供了官方的解决方案,专门用来获取核心库的路径:
正确的实现步骤
Libretro的环境回调API里有RETRO_ENVIRONMENT_GET_CORE_PATH这个请求类型,前端会主动把核心库的完整路径传递给你。具体实现如下:
先保存环境回调指针
在你的核心代码里,一定要在retro_set_environment函数中保存retro_environment_t类型的回调指针,这是后续请求路径的关键:static retro_environment_t environment_cb; void retro_set_environment(retro_environment_t cb) { environment_cb = cb; }请求核心库路径
在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'; } } }使用目录路径打开文件
现在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
相关产品推荐
相关产品推荐

