【问题标题】:Swift link and build with C/C++ library使用 C/C++ 库进行 Swift 链接和构建
【发布时间】:2017-06-13 03:50:16
【问题描述】:

我之前没有任何使用 swift 的经验。

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

我想把这个库链接到一个 swift iOS 应用程序中。我正在从头开始创建这个应用程序。

libseriallib.a 依赖于三个库。它们是:libz.a, 'libcrypto.a,libssh.a`。

我遵循here(使用模块)提到的第二种方法并尝试构建项目。但是,我很困惑如何链接三个依赖项并成功构建它。现在我只在 XCode Build Phases->Link Binary With Libraries 部分添加了libseriallib.a

我现在遇到的错误如下所示:

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 应用程序链接?

任何帮助将不胜感激。

【问题讨论】:

    标签: c swift linker static-libraries


    【解决方案1】:

    看看Build settings -&gt; Other linker flags

    您必须在此处列出您必须链接的所有库,例如 seriallibcryptozssh

    您还需要设置可以通过Build settings -&gt; Library search paths找到这些库的路径

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

    【讨论】:

      【解决方案2】:

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

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

      关于架构的警告不会阻止应用在模拟器中运行(目前)。但是,一旦您尝试在设备上运行它,它就不会构建,因为静态库不是为 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

      【讨论】:

        猜你喜欢
        • 2015-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-19
        • 2017-07-12
        • 1970-01-01
        相关资源
        最近更新 更多