为 XCode iOS 构建 C++ 静态库时出现问题
Problems Building C++ Static Library for XCode iOS
我在 Objective-c 中有一个大型 iOS 项目,它在 6 个子文件夹中也有大量 C++ 类。如果我在 iOS 项目中拥有所有 C++ 源代码并从源文件进行编译,那么一切都可以编译并正常工作。目前一切顺利。
我想将所有这些 C++ 代码移动到一个静态库中,所以我为我的 类 创建了一个新项目和一个包装器,并根据关于所以。它编译没有任何错误,并使用适当的 header.
创建了 .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 版本的相同代码创建静态库,它工作得很好,所以我知道基本代码、headers 和文件结构是好的。根据 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.2 MB。为什么他们会如此不同?应包括的所有源代码为 1.6MB。
我感觉问题不在于静态库是错误的体系结构,而在于它没有包括项目子文件夹中的所有 C++ 文件。我看到的另一个问题是,如果我错误地将静态库 XCode 项目配置为编译为可执行文件,我得到的错误集与我将静态库包含到设备项目中时得到的错误集完全相同,但我没有除了不编译所有文件之外,我完全知道该怎么做。它的编译速度也非常快,这让我再次相信它并没有把所有东西都构建到它应该构建的静态库中。请记住,当此 C++ 源代码作为主项目的一部分添加和编译时,一切正常。
有谁知道如何确保 XCode 将包含子文件夹中的所有文件以及与它们关联的 类?我是否需要在 XCode 中使用一个特殊的 linker 设置才能将其发送到 link 所有属于静态库项目的 C++ 文件?
有人知道我这里哪里错了吗?
非常感谢任何帮助和指导。
好吧,经过一番折腾,我意识到仅仅将文件夹包含到静态库项目中是行不通的。我必须为每个文件夹创建单独的组,然后将所有文件作为文件夹中的文件导入到这些组中。由于有多个级别的文件,这很让人头疼,但深夜最后模糊的线索是 XCode 中的文件夹是蓝色的,而不是黄色的。这是唯一的迹象,表明它们并未全部包括在内。我们在静态库项目中没有编译错误,只有在尝试在另一个项目中使用该静态库时才会出现任何错误。我以前也遇到过同样的事情,应该意识到当 XCode 中的文件夹为蓝色时,它没有导入您的文件,即使它们出现在里面并且看起来正在构建。 XCode 中的 C++ 静态库可以正常工作,一旦您将所有文件都包含在静态库项目中,它就会变得简单。
我在 Objective-c 中有一个大型 iOS 项目,它在 6 个子文件夹中也有大量 C++ 类。如果我在 iOS 项目中拥有所有 C++ 源代码并从源文件进行编译,那么一切都可以编译并正常工作。目前一切顺利。
我想将所有这些 C++ 代码移动到一个静态库中,所以我为我的 类 创建了一个新项目和一个包装器,并根据关于所以。它编译没有任何错误,并使用适当的 header.
创建了 .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 版本的相同代码创建静态库,它工作得很好,所以我知道基本代码、headers 和文件结构是好的。根据 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.2 MB。为什么他们会如此不同?应包括的所有源代码为 1.6MB。
我感觉问题不在于静态库是错误的体系结构,而在于它没有包括项目子文件夹中的所有 C++ 文件。我看到的另一个问题是,如果我错误地将静态库 XCode 项目配置为编译为可执行文件,我得到的错误集与我将静态库包含到设备项目中时得到的错误集完全相同,但我没有除了不编译所有文件之外,我完全知道该怎么做。它的编译速度也非常快,这让我再次相信它并没有把所有东西都构建到它应该构建的静态库中。请记住,当此 C++ 源代码作为主项目的一部分添加和编译时,一切正常。
有谁知道如何确保 XCode 将包含子文件夹中的所有文件以及与它们关联的 类?我是否需要在 XCode 中使用一个特殊的 linker 设置才能将其发送到 link 所有属于静态库项目的 C++ 文件?
有人知道我这里哪里错了吗?
非常感谢任何帮助和指导。
好吧,经过一番折腾,我意识到仅仅将文件夹包含到静态库项目中是行不通的。我必须为每个文件夹创建单独的组,然后将所有文件作为文件夹中的文件导入到这些组中。由于有多个级别的文件,这很让人头疼,但深夜最后模糊的线索是 XCode 中的文件夹是蓝色的,而不是黄色的。这是唯一的迹象,表明它们并未全部包括在内。我们在静态库项目中没有编译错误,只有在尝试在另一个项目中使用该静态库时才会出现任何错误。我以前也遇到过同样的事情,应该意识到当 XCode 中的文件夹为蓝色时,它没有导入您的文件,即使它们出现在里面并且看起来正在构建。 XCode 中的 C++ 静态库可以正常工作,一旦您将所有文件都包含在静态库项目中,它就会变得简单。