【问题标题】:Application runs fine when built from Xcode, won't run directly from the .app应用程序从 Xcode 构建时运行良好,不会直接从 .app 运行
【发布时间】:2016-10-26 16:10:31
【问题描述】:

在 Xcode 中处理 c++ mac 应用程序。当我点击运行时,一切都很好(调试和发布模式)。但是当我进入 finder 进入 Products/Release 文件夹并直接双击 .app 时,应用程序立即关闭并出现错误(应用程序意外退出。单击报告以查看更多详细信息)。当我单击报告时,它在似乎上出错的代码行表明它没有找到我的资源文件,但是当我构建/运行相同的应用程序时它发现它们很好 xcode。下面是我如何在代码中使用资源文件的示例:

std::ifstream file;
file.open("AppName.app/Contents/Resources/Saves/1.svd");
//do stuff
file.close();

任何人有任何想法,为什么双击 xcode 刚刚创建的 .app 与从 xcode 中运行它会产生不同的结果?

也不确定这是否是问题的一部分,但我必须从 .app 文件 (AppName.app/Contents/Resources/Saves/1.svd) 外部引用资源文件夹似乎很奇怪。我希望该路径与 .app/Contents/MacOS 中的可执行文件相关,如下所示(../Resources/Saves/1.svd),但这也不起作用。

【问题讨论】:

  • 当前目录在使用 Xcode 和在 Finder 中显式更改时可能不同。
  • @BoPersson 我不确定我是否理解,你能解释一下当前目录是什么意思吗?澄清一下,我不会将 .app 文件移动到另一个文件夹,然后双击它,我将进入 xcode 在我点击运行时创建的文件夹,然后单击它刚刚创建的 .app。还是您说“当前目录”是我需要在某处更改的设置?
  • 最终通过在文件上放置一个绝对路径来运行它(我继续并假设 .app 文件在 /Applications 中),如下所示:stackoverflow.com/questions/26161144/… 但是,id 仍然想知道如何以更稳定的方式做到这一点,即不假设 .app 位于计算机上的特定位置。如果有人知道,很想知道如何。谢谢
  • 我就是这个意思。相对路径是相对于某个“当前目录”的,它不一定是程序所在的位置。当您单击 i Finder 中的文件夹时,您会更改当前目录。 Xcode 可能会将其更改为其他内容,例如项目目录。

标签: c++ xcode macos build .app


【解决方案1】:

我遇到了类似的问题,花了一些时间研究不同的选项,最终我使用了 Apple 的对象。我需要获取资源文件夹:

#ifdef __APPLE__
#include "CoreFoundation/CoreFoundation.h"
#endif

那么实际的sn-p是:

#ifdef __APPLE__

char path[FILENAME_MAX];

CFBundleRef mainBundle = CFBundleGetMainBundle();
CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle);

if (!CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8 *)path, PATH_MAX)){
    //
    //log("CFURLGetFileSystemRepresentation returned false. Path:%s", path);
    exit(0);
}
CFRelease(resourcesURL);

chdir(path);

//log("Current path:%s", path);
#endif

【讨论】:

  • 谢谢!我在使用这个时遇到链接器错误
  • 架构 x86_64 的未定义符号:“_CFBundleCopyResourcesDirectoryURL”,引用自:Files.o 中的 Files::changeDirectoryToResourcesFolder() “_CFBundleGetMainBundle”,引用自:Files.o 中的 Files::changeDirectoryToResourcesFolder() “_CFRelease ",引用自:Files.o 中的 Files::changeDirectoryToResourcesFolder() “_CFURLGetFileSystemRepresentation”,引用自:Files.o 中的 Files::changeDirectoryToResourcesFolder() ld:未找到体系结构 x86_64 的符号:错误:链接器命令失败退出代码 1
  • 我需要在某个地方包含框架或某些东西才能使用这些吗?
  • 呃,没关系。 CoreFoundation.framework。感谢您的帮助!
  • @Dylan 是的,对不起,我忘了提到您需要链接 CoreFoundation 库。那是很久以前的事了……
猜你喜欢
  • 2013-07-27
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 2017-08-09
  • 2016-05-26
  • 2019-02-11
  • 2017-06-10
  • 1970-01-01
相关资源
最近更新 更多