Qt: Linking Framework на Mac: использование rpath

Я хочу создать пользовательский фреймворк с Qt. Я могу создать сам фреймворк, но Qt не может найти фреймворк при запуске:

dyld: Library not loaded: QSettingsDialog.framework/Versions/0/QSettingsDialog
Referenced from: /Users/sky/QtProjects/build-QSettingsDialog-Desktop_Qt_5_7_0_clang_64bit-Debug/Examples/SimpleExample/SimpleExample.app/Contents/MacOS/SimpleExample
Reason: image not found

Причина проста: двоичный файл не знает, где искать фреймворк.

Я использовал otool в двоичном файле и увидел это:

otool -L Examples/SimpleExample/SimpleExample.app/Contents/MacOS/SimpleExample
Examples/SimpleExample/SimpleExample.app/Contents/MacOS/SimpleExample:
QSettingsDialog.framework/Versions/0/QSettingsDialog (compatibility version 0.1.0, current version 0.1.2)
@rpath/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.7.0, current version 5.7.0)
@rpath/QtGui.framework/Versions/5/QtGui (compatibility version 5.7.0, current version 5.7.0)
@rpath/QtCore.framework/Versions/5/QtCore (compatibility version 5.7.0, current version 5.7.0)
/System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
/System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/AGL.framework/Versions/A/AGL (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)

Итак, мой вопрос заключается в следующем (для более подробной информации проверьте материал ниже):
Как можно сказать qmake, чтобы установить путь для моей библиотеки:

@rpath/QSettingsDialog.framework/Versions/0/QSettingsDialog (compatibility version 0.1.0, current version 0.1.2)

Есть ли способ сделать это с помощью qmake? Я знаю, как изменить это с install_name_tool, но я бы хотел добавить его в файл .pro напрямую.


Что я сделал до сих пор:

Я изменил свой pro-файл, чтобы изменить его на rpath двоичного файла, чтобы включить путь, по которому библиотека находится во время сборки:

otool -l Examples/SimpleExample/SimpleExample.app/Contents/MacOS/SimpleExample
Load command 22
cmd LC_RPATH
cmdsize 136
path /Users/sky/QtProjects/build-QSettingsDialog-Desktop_Qt_5_7_0_clang_64bit-Debug/Examples/SimpleExample/../../QSettingsDialog (offset 12)
Load command 23
cmd LC_RPATH
cmdsize 48
path /Users/sky/Qt/5.7/clang_64/lib (offset 12)

Таким образом, я могу просто изменить rpath для релиза, не используя install_name_tool, Однако, чтобы это работало, мне нужно изменить первую строку на:

@rpath/QSettingsDialog.framework/Versions/0/QSettingsDialog (compatibility version 0.1.0, current version 0.1.2)

В моем профессиональном файле для приложения я указал следующее:

mac {
QMAKE_LFLAGS += -F$$OUT_PWD/../../QSettingsDialog/
QMAKE_LFLAGS += '-Wl,-rpath,\'$$OUT_PWD/../../QSettingsDialog\''
LIBS += -F$$OUT_PWD/../../QSettingsDialog/ -framework QSettingsDialog
}

Последний отсутствующий кусок — это как добавить @rpath/, Спасибо за вашу помощь.

1

Решение

Благодаря ссылкам в комментарии @peppe я смог решить проблему:

Я должен был добавить

QMAKE_LFLAGS_SONAME = -Wl,-install_name,@rpath/

к библиотеки Про файл. Таким образом, Qt автоматически использует @rpath/QSettingsDialog.framework/Versions/0/QSettingsDialog при создании ссылки на фреймворк.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]