2017-06-13 75 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