【发布时间】:2020-09-17 06:35:34
【问题描述】:
我在 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++ ios objective-c xcode static-libraries