网上有很多帖子详细说明了相对路径在Xcode中是如何工作的.我有一个Xcode模板,我下载了相对路径DO工作,但我无法找出原因,也没有在其他项目中复制它.
首先,我在Xcode 3.1中使用C++.我不使用Objective-C,也不使用任何Cocoa/Carbon框架,只使用纯C++.
这是在我的其他Xcode模板中工作的代码:
sound->LoadMusic( (std::string) "Resources/Audio/Pop.wav" );
这个相对路径也适用于Windows.运行以下命令为我提供了应用程序完整路径的绝对路径:
std::cout << "Current directory is: " << getcwd( buffer, 1000) << "\n";
/应用/对myApp
我们怎样才能获得在Xcode .app包中工作的相对路径?
花了大约5个小时的谷歌和尝试不同的东西,最终找到答案!
#ifdef __APPLE__ #include "CoreFoundation/CoreFoundation.h" #endif // ---------------------------------------------------------------------------- // 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 // ----------------------------------------------------------------------------
我抛出了一些额外的包含警卫,因为这使得它只编译Apple(我开发跨平台)并使代码更好.
我感谢其他2个人的答案,你的帮助最终让我找到了正确的答案,所以我已经投票给你了.多谢你们!!!!
不要依赖二进制代码中的当前工作目录.只是不要.在Mac,Windows或Unix上,您无法信任操作系统或shell将其设置为您希望设置的位置.
对于直接C,在dyld.h中使用_NSGetExecutablePath来获取当前可执行文件的路径,然后你可以从那里开始相对.
如果您只是在试验并希望它能够工作,那么在Xcode中选择Project> Edit Active Executable,然后在那里有一个面板,您可以在其中将初始工作目录设置为项目目录,可执行文件的父目录或任意目录.这应仅用于测试目的.在Mac OS中,当您编写一个真实的应用程序并从Finder启动它时,工作目录是/.对于Unix应用程序,您无法控制工作目录.