使用C / C ++库进行Swift链接和构建

时间:2017-06-13 03:50:17

标签: c swift linker static-libraries

我之前没有任何关于swift的经验。

我有一个静态库libseriallib.a,它是用C ++编写的,但是使用extern C有一个C包装器接口。

我想将这个库链接到一个快速的iOS应用程序中。我从头开始创建这个应用程序。

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 ++库与swift iOS应用程序链接的综合资源?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

查看Build settings -> Other linker flags

您必须列出您必须链接的所有图书馆,例如seriallibcryptozssh

您还需要设置通过Build settings -> Library search paths

找到这些库的路径

确保您拥有这些库,并且所有这些库都是针对您正在使用的实际SDK版本和配置进行编译的(这是链接器告诉您的 - OS X与iOS)。

答案 1 :(得分:0)

在这种情况下,您不必使用模块映射。您可以在Build Phases->Link Binary With Libraries部分或Build Settings -> Other Linker Flags中添加所有4个静态库,在这种情况下,您需要将它们指定为-lseriallib -lcrypto -lz -lssh。在任何一种情况下,您都需要按照Build Settings -> Library Search Path的建议在ikliashchou添加路径。

关于C ++符号的错误,可以通过将-lc++添加到Other Linker Flags来解决这些错误。如果包装器是一个单独的库那就是那个;如果包装器代码是项目的一部分,则不应该收到这些错误。

关于体系结构的警告不会阻止应用程序在模拟器中运行(暂时)。但是,只要您尝试在设备上运行它,它就不会构建,因为静态库不是为iOS设备的体系结构构建的。

在设备的静态库中构建代码本身就是一个主题,可能很棘手。需要考虑的一些事项:

  • 从库源创建Xcode静态库项目。这个 需要为每个图书馆完成。
  • 将所有库源包含到您的应用程序项目中(in 这种情况下这种方法可能太乱了。)
  • 这些库可能还有其他不易依赖的依赖项 适用于iOS设备。
  • 图书馆代码可能已经移植到iOS,所以Google for 它。

以下是一些可能有用的链接: - 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