Где "App Bundle" ищет мою мультимедийную папку? Папка найдена при запуске приложения из Qt Creator, «файл не найден» при использовании терминала - PullRequest
0 голосов
/ 04 октября 2011

У меня небольшая проблема с тем, чтобы заставить мой пакет приложений работать с терминала или просто дважды щелкнуть по нему.

Это приложение фактически компилирует, связывает и прекрасно работает в среде разработки Qt Creator. Но, если я пытаюсь открыть его из терминала, я получаю ошибку «media / file.x file not found». Пакет приложения или исполняемый файл / Contents / MacOS / не находят папку «media», которая должна находиться рядом с исполняемым файлом.

В моем приложении я делаю что-то вроде:

openFile("media/file.x");

В Windows и Linux этот файл будет найден, если папка «media» находится точно в той же иерархической позиции исполняемого файла (рядом с ней). На Mac я обнаружил, что он работает по-другому, потому что Qt Creator создает «Пакет приложений», а фактический исполняемый файл находится в папке / Contents / MacOS, поэтому я скопировал туда «носитель» вручную. Это работало без каких-либо проблем при «воспроизведении» моего приложения из Qt Creator, но, как упоминалось ранее, не работает при запуске самого пакета.

Так кто-нибудь знает, где или как я могу гомогенизировать внешний вид этой папки "media", чтобы она работала как на Qt Creator, так и на комплекте приложений?

В последнее время я использовал следующую команду для «установки» папки в комплекте.

mac {
    MediaFiles.files = media
    MediaFiles.path = Contents/MacOS
    QMAKE_BUNDLE_DATA += MediaFiles
}

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 05 октября 2011

После нескольких дней поиска я нашел пару постов, в которых обсуждалась проблема относительного пути.Я просто не искал с правильными словами ... Ответ отображается в:

Относительные пути не работают в Xcode C ++

http://www.experimentgarden.com/2009/06/how-to-load-resource-from-your.html

В основном необходимо добавить это:

//On the include part
#ifdef __APPLE__
#include "CoreFoundation/CoreFoundation.h"
#endif


// On the main of your app
// 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
// ----------------------------------------------------------------------------

ВАЖНО: chdir изменяет рабочий путь приложения, поэтому нет необходимости изменять относительный код после этого ...

...