首页 > 解决方案 > 为 XCode iOS 构建 C++ 静态库的问题

问题描述

我在 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++ 文件?

有人知道我在这里哪里出错了吗?

非常感谢任何帮助和指导。

标签: c++iosobjective-cxcodestatic-libraries

解决方案


好的,所以经过一堆乱七八糟的事情后,我意识到仅将文件夹包含到静态库项目中是行不通的。我必须为每个文件夹创建单独的组,然后将所有文件作为文件夹中的文件导入这些组。由于有多个级别的文件,这很让人头疼,但最后一个模糊的深夜线索是 XCode 中的文件夹是蓝色而不是黄色。这是他们没有全部包括在内的唯一迹象。我们在静态库项目中没有编译错误,只有在另一个项目中尝试使用该静态库时才会出现任何错误。我之前也遇到过同样的事情,并且应该认识到当 XCode 中的文件夹为蓝色时,即使它们显示在内部并且似乎正在构建,它也没有导入您的文件。


推荐阅读