难以在Xcode中使用SDL_LoadBMP和相对路径

时间:2014-07-07 20:21:35

标签: c++ xcode relative-path portability sdl-2

首先,我知道这个问题被多次询问过;我已经阅读了至少五个或十个变体,但在我的案例中没有给出任何答案。我有这条线:

helloWorld = SDL_LoadBMP("helloworld.bmp");

在我的Xcode 5项目的main.cpp文件中。目录结构如下:

TestProject1
    main.cpp
    Resources
        helloworld.bmp
    TestProject1.1
TestProject1.xcodeproj

当然,我尝试过不同的路径,即Resources/helloworld.bmp,是的,将Resources文件夹导入到项目中。但是,该语句返回NULL,因为(根据SDL_Error)它无法找到该文件。现在,行:

helloWorld = SDL_LoadBMP("/fully/qualified/path/to/helloworld.bmp");

工作正常,所以我的代码不是问题。使Xcode与资源的相对路径一起使用的普遍接受的方法是什么?我正在寻找一种方法,当我创建一个更大的项目时,它将是可移植的(到SDL支持的平台,在不同的计算机/设备上),如果Xcode不能制作可移植的C ++项目,我愿意使用不同的IDE。我在阅读其他问题后尝试了其他一些事情:

helloworld.bmp添加到构建阶段>复制文件。

添加代码:

// ----------------------------------------------------------------------------
// This makes relative paths work in C++ in Xcode by changing directory to the Resources folder inside the .app bundle
#ifdef __APPLE__
CFBundleRef mainBundle = CFBundleGetMainBundle();
CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle);
char path[PATH_MAX];
if (!CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8 *)path, PATH_MAX))
{
    // error!
}
CFRelease(resourcesURL);

chdir(path);
std::cout << "Current Path: " << path << std::endl;
#endif
// ----------------------------------------------------------------------------

main.cpp的开头(在if (!CFURL...)行返回“Expected unqualified-id”编译错误。)

使用绝对路径 - 正如我所说,这有效,但我想要便携性。

调用getcwd:这是C ++代码。这里有什么我想念的吗?似乎getcwd不是C ++函数。

1 个答案:

答案 0 :(得分:3)

Build Phases中,您需要创建Copy Files类型的新构建阶段。

Destination设置为'资源',并将子路径留空,除非您想在资源中有一个子文件夹(当您有很多并且想要分离例如字体,纹理,声音等时可能很有用)< / p>

保留Copy only when installing 未分级

然后只需将资源添加到该构建阶段,在您的情况下为helloworld.bmp

然后您可以通过执行以下操作加载:

helloWorld = SDL_LoadBMP("helloworld.bmp");

或者如果您使用了子路径:

helloWorld = SDL_LoadBMP("textures/helloworld.bmp");

这与将SDL2.framework与应用程序捆绑在一起的方式相同。这里有一个教程 - http://zamma.co.uk/setup-sdl2-in-xcode-osx/,在第3部分中,它描述了如果你感兴趣的话如何捆绑框架。

总体而言,完全可移植的构建的最佳方式是像CMake或Gradle。