2017-06-13 39 views
0

我沒有與任何迅速以前的經驗。斯威夫特鏈接,並建立與C/C++庫

我這是用C編寫的靜態庫libseriallib.a ++但通過使用extern C一個C封裝接口。

我想這個庫鏈接到一個快速的iPhone應用程序。我從頭開始創建這個應用程序。

有三個庫,libseriallib.a依賴。這些是:libz.a,'libcrypto.a , libssh.a`。

我跟着第二方法中提到here(使用模塊),並試圖建立項目。但是,我很困惑如何鏈接這三個依賴關係併成功構建它。現在我只將libseriallib.a添加到XCode Build Phases->Link Binary With Libraries部分。

的錯誤,現在我已經是這樣的:

Apple Mach-O Linker Warning Group 
ld: warning: URGENT: building for iOS simulator, but linking in object file (/Users/duminda/dev/swiftlibtest/libseriallib.a(seriallib.cpp.o)) built for OSX. Note: This will be an error in the future. 

ld: warning: object file (/Users/duminda/dev/swiftlibtest/libseriallib.a(seriallib.cpp.o)) was built for newer OSX version (10.11) than being linked (10.0) 

ld: warning: URGENT: building for iOS simulator, but linking in object file (/Users/duminda/dev/swiftlibtest/libseriallib.a(mem_buffer.cpp.o)) built for OSX. Note: This will be an error in the future. 

ld: warning: object file (/Users/duminda/dev/swiftlibtest/libseriallib.a(mem_buffer.cpp.o)) was built for newer OSX version (10.11) than being linked (10.0) 

ld: warning: URGENT: building for iOS simulator, but linking in object file (/Users/duminda/dev/swiftlibtest/libseriallib.a(buffers.cpp.o)) built for OSX. Note: This will be an error in the future. 

ld: warning: object file (/Users/duminda/dev/swiftlibtest/libseriallib.a(buffers.cpp.o)) was built for newer OSX version (10.11) than being linked (10.0) 

ld: warning: URGENT: building for iOS simulator, but linking in object file (/Users/duminda/dev/swiftlibtest/libseriallib.a(packet_reader2.cpp.o)) built for OSX. Note: This will be an error in the future. 

ld: warning: object file (/Users/duminda/dev/swiftlibtest/libseriallib.a(packet_reader2.cpp.o)) was built for newer OSX version (10.11) than being linked (10.0) 

Apple Mach-O Linker Error Group 
    "std::runtime_error::what() const", referenced from: 

    "std::__1::__basic_string_common<true>::__throw_length_error() const", referenced from: 

    "std::__1::locale::use_facet(std::__1::locale::id&) const", referenced from: 

    "std::__1::ios_base::getloc() const", referenced from: 

    "std::runtime_error::runtime_error(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from: 

現在,它看起來像我也必須鏈接libstd++

是否有全面的資源如何在C/C++庫以迅速的iOS應用鏈接?

任何幫助將不勝感激。

回答

0

看看到Build settings -> Other linker flags

你必須列出所有存在你要鏈接,像seriallibcryptozssh的庫。

還需要設置好這些庫可以通過Build settings -> Library search paths找到路徑

請確保您有那些庫可用,所有的人編爲實際的SDK版本和配置您正在使用(這是什麼鏈接告訴你 - OS X vs iOS)。

0

您不必在這種情況下使用模塊的地圖。您可以在Build Phases->Link Binary With Libraries部分或Build Settings -> Other Linker Flags中添加所有4個靜態庫,在這種情況下,您需要將它們指定爲-lseriallib -lcrypto -lz -lssh。無論哪種情況,您還需要在中添加他們的路徑,如ikliashchou所示。

至於有關C++符號的錯誤,可以通過將-lc++添加到Other Linker Flags來解決。這就是如果包裝是一個單獨的庫;如果包裝代碼是項目的一部分,你不應該得到這些錯誤。

關於體系結構的警告不會阻止應用程序在模擬器中運行(現在)。但是,只要您嘗試在設備上運行它,它就不會生成,因爲靜態庫不是爲iOS設備的體系結構構建的。

在這些設備的靜態庫中構建代碼本身就是一個主題,可能會非常棘手。需要考慮的幾件事:

  • 從庫源創建一個Xcode靜態庫項目。這個 需要爲每個庫完成。
  • 包括所有的庫源代碼到你的應用程序項目(在 這種情況下,這種做法很可能是太亂了)。
  • 文庫可以具有不容易 適用於iOS設備又一些其它相關性。
  • 庫代碼可能已經被移植到iOS,因此谷歌的 它。

這裏有一些鏈接,可能會有所幫助: - How do I compile a library in Xcode using a makefile? - Can I build a static library for iOS without using the Xcode IDE? - Compiling external C++ library for use with iOS project