【问题标题】:Difficulty in using SDL_LoadBMP with relative path in Xcode在 Xcode 中使用带有相对路径的 SDL_LoadBMP 有困难
【发布时间】:2014-08-28 10:34:18
【问题描述】:

首先,我知道这个问题已经被问过很多很多次了;我已经阅读了至少五到十个变体,但给出的答案都没有在我的案例中起作用。我有电话:

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 支持的平台,ofc 在不同的计算机/设备上),并且如果 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++ 函数。

【问题讨论】:

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


    【解决方案1】:

    在您的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 之类的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-14
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 2018-12-08
      相关资源
      最近更新 更多