在Xcode中难以使用带有相对路径的SDL_LoadBMP

Difficulty in using SDL_LoadBMP with relative path in Xcode

本文关键字:路径 相对 SDL LoadBMP Xcode      更新时间:2023-10-16

首先,我知道这个问题已经被问过很多次了;我读了至少五到十种不同的答案,但没有一种答案适合我。我有一行:

helloWorld = SDL_LoadBMP("helloworld.bmp");

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

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

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

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

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

add helloworld.bmp to Build Phases> Copy Files.

添加代码:

// ----------------------------------------------------------------------------
// 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++函数

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

设置Destination为"资源",并将子路径留空,除非你想在你的资源中有一个子文件夹(当你有很多并且想要分离例如字体,纹理,声音等时可以使用)

不勾选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这样的东西。