簡體   English   中英

為 XCode iOS 構建 C++ 靜態庫的問題

[英]Problems Building C++ Static Library for XCode iOS

我在 Objective-c 中有一個大型 iOS 項目,它在 6 個子文件夾中也有大量 C++ 類。 如果我在 iOS 項目中擁有所有 C++ 源代碼並從源文件編譯,那么一切都可以編譯並且工作得很好。 到目前為止一切都很好。

我想將所有這些 C++ 代碼移動到一個靜態庫中,所以我為我的類創建了一個新項目和一個包裝器,並根據 SO 上的大量指令將其編譯為一個靜態庫。 它編譯時沒有任何錯誤,並創建了帶有適當標頭的 .a 輸出文件。

當我將此靜態庫包含到我的項目中時,我收到 11 個與以下相關的錯誤:

Undefined symbols for architecture arm64:
  "Configuration::Configuration()", referenced from:
  ___cxx_global_var_init in libMInterfaceLib.a(M- 
   3fdac31d875d4f01157909522738d4c95b3c465d55314d375878e8f2faec0803.o)

 "Type::GetSizes(int, int, int&, int&, int&)", referenced from:
    CM::BitSizes() in libMInterfaceLib.a(M- 
  3fdac31d875d4f01157909522738d4c95b3c465d55314d375878e8f2faec0803.o)

當我使用 lipo info 命令時,我確認我的靜態庫是架構:arm64

 $lipo -info libMInterfaceLib.a
 Non-fat file: libMInterfaceLib.a is architecture: arm64

這是有道理的,因為我正在為設備構建靜態庫並將其包含在設備構建中。 我沒有在這個項目中使用模擬器,因為它需要一個實時攝像頭,所以我只需要一個架構,即 arm64。

如果我從應用程序的 Linux 版本的相同代碼創建一個靜態庫,它工作得很好,所以我知道基本代碼、頭文件和文件結構都很好。 該靜態庫根據 lipo -info 說它是架構 x86_64,這是有道理的。

$lipo -info libMInterfaceLib-OSx.a
Non-fat file: libMInterfaceLib-OSx.a is architecture: x86_64

我看到的另一件事是,由 XCode 作為靜態庫構建的 .a 文件是 732KB,但 Eclipse 為 Linux 從完全相同的源文件構建的文件是 2.2MB。 為什么他們會如此不同? 應該包含的所有源代碼都是 1.6MB。

我覺得問題不在於靜態庫是錯誤的架構,而是它不包括項目子文件夾中的所有 C++ 文件。 我看到的另一個問題是,如果我錯誤地將靜態庫 XCode 項目配置為編譯為可執行文件,我會得到與將靜態庫包含到設備項目中時得到的完全相同的錯誤集,但我不太清楚除了不編譯所有文件之外,還有什么可以做的。 它的編譯速度也非常快,這讓我再次相信它沒有將所有內容都構建到靜態庫中。 請記住,當這個 C++ 源代碼作為主項目的一部分被添加和編譯時,它一切正常。

有誰知道如何確保 XCode 將包含子文件夾中的所有文件以及與它們關聯的類? 是否有一個特殊的鏈接器設置需要在 XCode 中使用才能讓它鏈接作為靜態庫項目一部分的所有 C++ 文件?

有誰知道我哪里出錯了?

非常感謝任何幫助和指導。

好的,所以經過一堆亂七八糟的事情后,我意識到僅將文件夾包含到靜態庫項目中是行不通的。 我必須為每個文件夾創建單獨的組,然后將所有文件作為文件夾中的文件導入到這些組中。 由於有多個級別的文件,這很麻煩,但最后一個模糊的深夜線索是 XCode 中的文件夾是藍色而不是黃色。 那是他們沒有全部包括在內的唯一跡象。 我們在靜態庫項目中沒有編譯錯誤,只有在另一個項目中嘗試使用該靜態庫時才會出現任何錯誤。 我以前也遇到過同樣的事情,應該已經認識到,當 XCode 中的文件夾為藍色時,它沒有導入您的文件,即使它們顯示在里面並且似乎正在構建。 一旦您將所有文件都包含在靜態庫項目中,XCode 中的 C++ 靜態庫就可以工作並且很簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM