我在 Mac 上通过 SDL2 访问文件时遇到了一个奇怪的问题。我在 OS X Mountain Lion 上使用 XCode 4,并且使用 SDL2 作为框架。我不是从源代码编译 SDL2。我已经将框架添加到包中,以及我需要加载的文件。该程序在 XCode 中构建并运行良好,但文件不会在编辑器外部加载(即,如果我双击独立的 .app,文件不会加载)。这是我的 .app 包的样子:
MyApp.app/
Contents/
Frameworks/
SDL2.framework/
MacOS/
MyApp
Resources/
Configure.txt
MyBMP.bmp
Info.plist
PkgInfo
在我的 C 代码中,我尝试这样做:
SDL_LoadBMP("MyApp.app/Contents/Resources/MyBMP.bmp");
不仅如此:
SDL_LoadBMP("MyBMP.bmp");
以及几乎所有介于两者之间的东西。 我还尝试通过以下方式访问文本文件:
FILE* data = fopen("MyApp.app/Contents/Resources/Configure.txt", "r");
和
FILE* data = fopen("Configure.txt", "r");
没有成功。 在 XCode 编辑器中,只有长的绝对路径有效,而我尝试过的任何东西在独立的 .app 中都不起作用。
其他人是否遇到了这个问题?我在使用 SDL 1.2 时加载了文件,但由于某种原因似乎没有加载 SDL2。 SDL2 是否在初始化期间对事件目录做了一些奇怪的事情?
------------编辑 1------------ 我最近尝试使用这段代码弄清楚发生了什么:
#include "SDL2/SDL.h"
#include "stdio.h"
#include "stdlib.h"
int main (int argc, char** argv){
if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
return EXIT_FAILURE;
FILE* test = fopen("Test.txt", "w");
if (!test)
return EXIT_FAILURE;
fprintf(test, "Let's see where this ends up...");
fclose(test);
return EXIT_SUCCESS;
//The rest of my code, which shouldn't ever come into play...
}
当从 XCode 4 编辑器运行时,这会按预期工作。在 Debug 文件夹中,就在我的 .app 文件旁边,有一个 Test.txt 文件,其中包含短语“让我们看看它在哪里结束......”。但是,当通过单击独立应用程序运行时,程序立即结束并且找不到文本文件。我检查了日志,它只是说程序以代码 1 退出。通过更彻底的分析,似乎 fopen()
失败了。有谁知道可能发生的事情吗?
最佳答案
您可以使用以下方法将工作目录设置为应用程序包中的 Resources 目录:
#include "CoreFoundation/CoreFoundation.h"
char path[PATH_MAX];
CFURLRef res = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle());
CFURLGetFileSystemRepresentation(res, TRUE, (UInt8 *)path, PATH_MAX)
CFRelease(res);
chdir(path);
您可能希望在 #ifdef __APPLE__
和 #endif
之间换行以实现跨平台兼容性。
关于c - SDL2 Mac 文件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18690800/