我有一個基于 C 的快速靜態庫,名為: FooCppBasedSwiftLibrary
- 它是一個 Swift 靜態庫,它使用一些 C 源代碼與 Objective C 混合使用
.mm檔案(Objective C) - ObjectiveC 類使用
module.private.modulemap檔案暴露給 Swift(在同一個庫中) - 庫自行構建成功并生成
libFooCppBasedSwiftLibrary.a二進制FooCppBasedSwiftLibrary.swiftmodule檔案和檔案 BUILT FOR SIMULATOR - 然后在客戶端應用程式專案中,我添加并鏈接了
.a檔案 - 同樣在客戶端應用程式專案中,我添加了
.swiftmodule檔案并SWIFT_INCLUDE_PATHS在應用程式的構建設定中給出了它的父檔案夾路徑 - 現在,我在與靜態庫中具有相同 iOS 版本的同一模擬器上構建客戶端應用程式,但出現了許多錯誤,例如:
// ...100-500 lines error log above...
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

uj5u.com熱心網友回復:
TLDR: Use linker flag: -lc or -lstdc
// You can skip to the "The Endgame" section below
初始解決方法
背景
在瀏覽許多論壇尋求解決方案時,我遇到了某人的想法:
注意:此文本參考自類似問題的執行緒(如我的),但不同之處在于:Importing Swift Static Library in ObjC Project
這是因為主要目標(應用程式)試圖僅針對 Objective-C 構建,并且靜態庫沒有告訴它需要包含 Swift 庫。這是因為應用目標的構建階段的編譯源部分中沒有任何 Swift 檔案。
所以基本上你所要做的就是在編譯串列中添加至少一個 .swift 檔案,它會包含你的 Swift 庫。它甚至不需要任何代碼或值,它可以是一個空檔案。
解決方法:
因此,考慮到相同的邏輯,我想,我的客戶 App Project,它基于 Swift:
它如何知道靜態庫
libFooCppBasedSwiftLibrary.a已經使用或需要(不確定這里的正確詞是什么)標準 C 庫,例如:std::
所以解決這個問題的方法是:
- 在我的客戶端應用程式專案中,單擊根/任何檔案夾
"New File..."->選擇"C File"->設定任何檔案名->檢查"Also create a header file"->Next->Create->您將收到提示“您要配置 Objective-C 橋接頭嗎?”,單擊開"Create Bridging Header"按鈕
和你 訂,現在你建立應用程式,應該作業正常!
這充其量是一種解決方法,但不確定是否有任何構建設定可以強制執行此操作,而不是添加空 C 檔案。
The Endgame:
經過更多的挖掘,我找到了完美的解決方案
首先,忽略/撤消該初始解決方法,我們不再需要它
轉到客戶端應用程式專案的構建設定(對于應用程式目標),然后Other linker flags添加-lc 或-lstdc 構建應用程式,完成!
什么chooese
-lc或-lstdc?在構建設定中檢查
"C standard library"/CLANG_CXX_LIBRARY設定如果它
libc那么使用:lc在Other linker flags否則,如果它
libstdc那么使用:lstdc在Other linker flags
我假設這是明確告訴聯結器將.a 靜態庫的二進制檔案與給定的標準 C 庫正確鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/406744.html
標籤:
