Переменные среды в info.plist не работают

Я использую info.plist в Xcode для установки переменных среды, DYLD_LIBRARY_PATH и DYLD_FRAMEWORK_PATH.

Я устанавливаю DYLD_LIBRARY_PATH в

$CONTENTS_FOLDER_PATH/runtime/1.1.0:$CONTENTS_FOLDER_PATH/modules/tiapp/1.1.0:$CONTENTS_FOLDER_PATH/modules/ticodec/1.1.0:$CONTENTS_FOLDER_PATH/modules/tidatabase/1.1.0:$CONTENTS_FOLDER_PATH/modules/tifilesystem/1.1 .0:$CONTENTS_FOLDER_PATH/modules/timedia/1.1.0:$CONTENTS_FOLDER_PATH/modules/timonkey/1.1.0:$CONTENTS_FOLDER_PATH/modules/tinetwork/1.1.0:$CONTENTS_FOLDER_PATH/modules/tiplatform/1.1.0:$CONTENTS_FOLDER_PATH/ модули/tiprocess/1.1.0:$CONTENTS_FOLDER_PATH/modules/tiui/1.1.0:$CONTENTS_FOLDER_PATH/modules/tiworker/1.1.0

и

DYLD_FRAMEWORK_PATH в

$CONTENTS_FOLDER_PATH/время выполнения/1.1.0

И когда я дважды щелкаю папку .app, dlopen не может найти ни одного из моих .dylib, на которые есть ссылки в папках выше.

Если я возьму точно такие же переменные и пути и помещу их в свои исполняемые аргументы в Xcode, все будет работать нормально, но только если я запускаю программное обеспечение через Xcode, и мне нужно, чтобы все работало, когда вы нажимаете на папку .app.

Что я делаю неправильно в info.plist? Не нравится $CONTENTS_FOLDER_PATH? Нужен ли ему другой разделитель? Почему одни и те же аргументы работают в исполняемых аргументах, но не в файле info.plist?

Заранее спасибо.


person Michael Wildermuth    schedule 16.07.2011    source источник


Ответы (2)


Какой ключ вы используете в Info.plist для установки переменных среды? Вы имеете в виду, что устанавливаете переменные среды в конфигурации «Переменные среды» Xcode (часть схемы в Xcode 4, часть пользовательского исполняемого файла в Xcode 3), или вы просто бросаете ключ/значения в Info.plist и ожидать, что они появятся в окружающей среде?

В первом случае, даже если бы это сработало, это было бы полезно только при запуске Xcode, а не при отправке продукта. В последнем случае, насколько мне известно, Info.plist не имеет механизма добавления переменных окружения.

Лично, вместо того, чтобы иметь это огромное дерево в вашем пакете, я бы попросил Xcode скопировать все ваши dylibs в каталог плагинов вашего пакета (PlugIns), а затем использовать NSBundle (или CFBundle), чтобы получить путь к нему. Или вы можете использовать другой каталог, если это не совсем «плагины». Но поместите их все в один каталог внутри вашего пакета. Не ищите их. (Вы можете иметь их во многих каталогах вашего исходного дерева; речь идет исключительно о пакете.)

person Rob Napier    schedule 16.07.2011
comment
Я использую Xcode 3 и устанавливаю переменную среды info.plist Переменные среды, на самом деле info.plist она отображается как LSEnvironment. Я могу найти свой прямой путь к каждому из моих .dylib в моем комплекте, но проблема в том, что сами .dylib зависят от других .dylib, поэтому, когда я делаю вызов dlopen и загрузка .dylib использует переменную окружения DYLD_LIBRARY_PATH, чтобы найти пути к другим файлам .dylib, от которых он зависит, поэтому мне нужно добавить пути из моего пакета в переменную DYLD_LIBRARY_PATH, прежде чем приложение откроется. Мне нужно, чтобы это работало везде, где может быть приложение. - person Michael Wildermuth; 16.07.2011
comment
Переменные сборки Xcode, такие как CONTENTS_FOLDER_PATH, недоступны во время выполнения для запуска служб. Я бы начал с более простой системы ссылок, в идеале со статической системой ссылок. В противном случае вам нужно будет либо установить DYLD_LIBRARY_PATH в своем коде, а если даже это невозможно, вам нужно будет создать вспомогательный исполняемый файл, который устанавливает его для вас на основе местоположения вашего пакета, а затем запускает ваш реальный исполняемый файл. Все это чрезмерно сложные подходы, и настоятельно рекомендуется использовать статическое связывание. - person Rob Napier; 17.07.2011
comment
Я не думаю, что статическое связывание — это вариант для меня прямо сейчас. Спасибо, хотя за предложения. На самом деле текущий дизайн заключался в том, чтобы первый запуск приложения задавал переменные среды, а затем снова запускал тот же исполняемый файл, в котором затем были установлены переменные среды, что-то вроде вашего предложения помощника по сборке. Я пытаюсь избежать этого подхода и, надеюсь, иметь одно исполнение приложения, чтобы всем было проще. - person Michael Wildermuth; 17.07.2011

В итоге я использовал @rpath, чтобы найти все свои дилибы и фреймворки. Я пересобрал все фреймворки и библиотеки с именем установки @rpath/-имя библиотеки или фреймворка-.

Затем я добавил в настройки пути поиска основного проекта относительные имена путей, такие как @loader_path/../runtime/1.1.0 и @loader_path/../modules/ и т. д.

Это позволяет вызову dlopen найти текущий путь без использования plist или исполняемых аргументов.

person Michael Wildermuth    schedule 28.10.2011