Qt for iOS 應用使用自定義動態庫 Framework
- 2020 年 1 月 4 日
- 筆記
本文內容適合當你想使用 Qt 調用 xcode 開發的動態庫 framework 做 iOS 應用的場景,文中涉及到原始動態庫 framework 文件的配置,以及 Qt 如何引入和打包動態庫 framework 到自身程式中的方法。
動態庫 framework 的配置
默認 xcode 創建的 framework 都已經是動態庫形式了,所以這裡不多介紹,請確保你的 Build Settings 中以下設置是無誤的,特別是 Dynamic Library Install Name Base
,它決定了動態庫能否被應用成功搜索到。
對於 @rpath 的說明,請看這裡:https://www.cnblogs.com/csuftzzk/p/mac_run_path.html
Qt 項目配置引入 framework
Qt 引入 framework 只需要給 LIBS 追加 framework 的路徑和要鏈接的文件就可以了,配置如下,請注意使用 framework 參數是 -F 和 -framework(注意大小寫)
LIBS += -F$$PWD/../../build/Products/Release LIBS += -framework my_dylib.framework
這樣引入還是不行的,因為 iOS 應用部署上去以後動態庫的 framework 文件是不會跟隨打包進去的,所以你還需要做一件事情就是把 framework 打包到你的應用中,配置如下:
MY_DYLIB_FRAMEWORK.files = $$PWD/../../build/Products/Release-iphoneos/my_dylib.framework MY_DYLIB_FRAMEWORK.path = /Frameworks QMAKE_BUNDLE_DATA += MY_DYLIB_FRAMEWORK
分別指定了 framework 文件的路徑和要被打包進去的目標路徑,這裡是將 $$PWD/../../build/Products/Release-iphoneos/my_dylib.framework 這個 framework 打包到了應用的 /Framework 目錄下。最終你看到的應用目錄結構是這樣的
├── [email protected] ├── Frameworks │ └── my_dylib.framework │ ├── Info.plist │ ├── ReadMe.txt │ ├── _CodeSignature │ │ └── CodeResources │ └── my_dylib ├── Info.plist ├── LaunchScreen.nib ├── PkgInfo ├── _CodeSignature │ └── CodeResources └── cross-platform-demo
可以看到,mu_dylib.framework 文件已經在我們應用的 /Framework 目錄下了,這樣文件就被打包進去了,而且當你使用 Qt 編譯程式的時候,在 Build Shadow 目錄下會看到生成對應的 xcodeproj 文件,可以直接使用 xcode 打開,使用 xcode 打開項目後可以看到項目的 Build Phases 下面多了一條 Copy file to bundle 的項目:
但是當你嘗試在 iOS 或者模擬機中運行這個應用時你會發現又有新的錯誤了,如下所示:
dyld: Library not loaded: @rpath/my_dylib.framework/my_dylib Referenced from: /var/containers/Bundle/Application/D0143CDE-FFFE-4343-BFD9-D70DA66C831F/cross-platform-demo.app/cross-platform-demo Reason: image not found program received signal 6, thread:15362b
我明明已經把文件複製進去了,為什麼還是會提示,還記得上面我們提到的 Dynamic Library Install Name Base
嗎?這是動態庫 framework 設置的,根據上面文章的資料,我們要在調用該模組的應用中設置 rpath 的搜索範圍,讓其能找到我們的動態庫文件。Qt 項目中添加如下配置:
# 添加應用的 runpath 路徑,因為 my_dylib 動態庫 Framework 設置的 install path 為 rpath,所以應用使用時需要單獨設置 QMAKE_LFLAGS += -Wl,-rpath,@loader_path/Frameworks
如此設置後,在 Qt 中就可以成功編譯程式並運行在模擬器或真機上了,如果還有任何疑問歡迎留言我們一起討論。