os x app无法加载Resources文件夹中的文件

时间:2014-01-23 04:20:55

标签: c++ macos

我正在尝试在osx上测试库assimp(Lion 10.7.5)。但是Demo.app找不到位于Demo.app/Contents/Resources文件夹中的模型文件。奇怪的是,我的旧演示工作得很好。 这是主要代码:

bool ImportModel(const string& pFile)
{
    Assimp::Importer importer;
    const aiScene* scene = importer.ReadFile(pFile, ...);
    if(!scene)
    {
        cout<<importer.GetErrorString()<<endl;
        return false;
    }
    return true;
}

int main(void)
{
    while(ImportModel("skin.xml"));
    return 0;
}

它保持返回:无法打开文件“skin.xml”。 这是Demo.app的结构:

Contents
    Frameworks
    info.plist
    MacOS
        Demo
        libassimp.dylib
    Resources
        Demo.icns
        skin.xml -> the model file.

知道哪里可能出错?谢谢你们。

1 个答案:

答案 0 :(得分:0)

从assimp的文档中,Assimp::Importer::ReadFile将路径作为第一个参数。似乎没有(至少从文档中)对默认路径Resources文件夹的任何特定支持。

很有可能你必须提供文件的完整路径才能从这些库中正确读取它,这意味着获取主包的资源路径,附加模型文件名,以及转换最终文件ac字符串的路径(将成为std :: string)。或者,您可以获取主要包的资源路径,将其转换为c字符串并将skin.xml附加到该字符串。

如果您使用的是objective-c ++,这很简单:

NSBundle *bundle = [NSBundle mainBundle];
NSString *path = [bundle pathForResource: @"skin" ofType: @"xml"];
// now get the c string from the path
const char *cPath =[path cStringUsingEncoding: NSUTF8StringEncoding];

如果你想继续使用基础的C ++,由于手动内存管理和更广泛的错误检查,它有点棘手(对于上面的内容,你可以通过cPath进行错误检查,因为目标-C代码将毫无问题地发送消息nil