为XCode iOS构建C++静态库的问题

Problems Building C++ Static Library for XCode iOS

本文关键字:问题 静态 C++ XCode iOS 构建      更新时间:2024-03-28

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

有人知道我哪里错了吗?

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

好吧,经过一番折腾,我意识到仅仅将文件夹包含在静态库项目中是行不通的。我必须为每个文件夹创建单独的组,然后将所有文件作为文件夹中的文件导入这些组。由于有多个级别的文件,这让人头疼,但最后一个模糊的深夜线索是XCode中的文件夹是蓝色的,而不是黄色的。这是唯一的迹象,表明他们没有全部包括在内。静态库项目中没有编译错误,只有当试图在另一个项目中使用该静态库时,才会出现任何错误。我以前也遇到过同样的事情,应该已经意识到,当XCode中的文件夹为蓝色时,它并没有导入你的文件,即使它们显示在里面并看起来是构建的。XCode中的C++静态库在静态库项目中包含所有文件后就可以工作,而且很简单。