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