Qt for iOS 應用使用自定義動態庫 Framework

本文內容適合當你想使用 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 中就可以成功編譯程式並運行在模擬器或真機上了,如果還有任何疑問歡迎留言我們一起討論。

相關