Изменение пути dylib с помощью install_name_tool
install_name_tool -change /usr/local/lib/testlib.dylib "$TARGET_BUILD_DIR"/../../testlib.dylib "$PRODUCT_NAME"
Мне было сказано выше, когда ввод в скрипт запуска в xcode изменит путь поиска динамической библиотеки. это можно проверить, введя следующее в окне терминала
otool -L /drag/the/executable/here/and/its/filepath/will/show/up/testlib
на выходе будет что-то вроде следующего
/previous/filepath:
/usr/local/lib/testlib.dylib (compatibility version 1.0.0, current version 1.0.0)
./anothertestlib.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 56.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
Мой вопрос: почему не работает команда install_name_tool? Это не сейчас, но это было, когда проект testlib был целевой зависимостью клиентского проекта. Теперь я только что перетащил.dylib в клиентский проект. путь поиска находится в usr / local / lib.
А также, что такое usr / local / lib, почему система считает, что там находится мой dylib, и как он туда попал?
1 ответ
install_name_tool работает, перезаписывая строки пути, поэтому любой новый должен быть такой же длины или короче, чем исходный.
Поскольку "/usr/local/lib/testlib.dylib" имеет длину 28 символов, а "" TARGET_BUILD_DIR"/../../testlib.dylib" имеет длину не менее 20 символов, если переменная $TARGET_BUILD_DIR раскрывается в строку из 9 символов или более, замена, вероятно, будет слишком длинной для использования.
Я говорю, вероятно, потому что вы можете добавить флаг -headerpad_max_install_names к компоновщику, чтобы он добавлял заполнение после каждого пути, чтобы было место для более длинных замен (я полагаю, до 1024 символов). Хотя так как install_name_tool не работает, то, вероятно, он не использовался.
Что касается пути / usr / local / lib, технически / usr (/ usr / bin, / usr / lib и т. Д.) Используется для программного обеспечения, которое применяется к любой машине и которое может быть смонтировано в сети, тогда как / usr / Локальный корень (/ usr / local / bin, / usr / local / lib) предназначен для всего, что относится только к локальной машине. На практике чаще всего пакеты, поставляемые через дистрибутив ОС users / usr и пользовательские установки, используют / use / local. По большей части это не имеет значения. В частности, на Mac менеджер пакетов Homebrew использует корневой каталог / usr / local (тогда как MacPorts использует / opt и Fink / sw).
Просто так получается, что все, что вы делали для первоначальной установки, использовало это местоположение поверх любых других опций. Но пока все, что требуется, знает, где искать, это не более или менее действительное место.