在Objective-C中使用外部C ++头文件

在我的iOS项目中,我需要使用用C ++编写的外部库。 C ++头文件都在一个目录中。

我已经将这些C ++头文件添加到我的Xcode项目中,并且还指定了头文件searchpath(在“生成设置”中)。

问题是这些C ++头文件使用<>尖括号包含对方。 这导致:

'filename.h' file not found with <angled> include, use "quotes" instead. 

奇怪的是Xcode不会抱怨所有的头文件。 同样的,包含在一个文件中的头文件是好的,而在另一个文件中包含的时候是一个问题。 我认为这是由于这些标题#包括对方的事实。

  1. 为什么searchpath不工作?
  2. 有没有办法解决这个问题,而不修改这些头文件?

谢谢!

 #include <bla.h> 

是用于标准库或框架头的,search策略与用于的不同

 #include "bla.h" 

看例如

  • #include <filename>和#include“filename”有什么区别?

作为一种解决方法,您可以将Xcode构build设置“总是search用户path”设置为YES。

从“空白”应用程序项目开始:

  1. 在应用程序的项目中创build一个文件夹“Libraries” – 作为MyApp.xcodeproj文件的一个兄弟,最好在任何地方。 除非二进制是包含所有体系结构的通用二进制归档文件,否则为每个configuration(debugging,发布等)以及可能的每个体系结构(armv7,armv7s,arm64)创build子文件夹。

  2. 获取第三方库的头文件和静态库二进制文件(对于不同的平台,configuration和体系结构可能不止一个),并将它们移动到相应的子文件夹(您可能需要创build)到“库”文件夹中:

    例如,假设你有一个通用的二进制文件(armv7,armv7s,arm64)以及该库的Debug和Release版本:现在,假设文件夹结构如下:

     $(SRCROOT)/Libraries Debug-iphoneos include ThirdParty third_party.hh ... libThirdParty.a Release-iphoneos include ThirdParty third_party.hh ... libThirdParty.a MyApp.xcodeproj 
  3. “库searchpath”构build设置:

    将“Libraries”文件夹拖到Xcode项目中。 这可能会自动在构build设置中创build库searchpath。 请validation这一点,如果不正确,请修复它。

    给出这个例子,为debugging和发布configuration添加以下库searchpath:

    debugging: 库searchpath$(SRCROOT)/Libraries/Debug-iphoneos

    发布: 库searchpath$(SRCROOT)/Libraries/Release-iphoneos

    对于特定的configuration和目标平台对,您可能有不同的库searchpath。 相应地在构build设置中设置不同的path。

  4. “标题searchpath”构build设置:

    给出这个例子,将下面的头部searchpath添加到Debug和Releaseconfiguration中:

    debugging: 标题searchpath$(SRCROOT)/Libraries/Debug-iphoneos/include

    发布: 标题searchpath$(SRCROOT)/Libraries/Release-iphoneos/include

    同样,对于特定的configuration/目标对,您可能有不同的path – 尽pipe标头可能相同。

  5. 通过将-lc++添加到Other Linker Flags构build设置,将您的应用程序与C ++标准库链接起来

  6. 按如下所示在文件中导入标题:

      #import <ThirdParty/third_party.hh> 

在将“用户标题searchpath”设置为指向您的图书馆目录之后,在XCode中,还必须确保名为“总是search用户path”的字段设置为“是”

这解决了我遇到的问题:用<angular度>包含<boost / signals2.hpp>文件没有find,使用“引号”来代替。

在Xcode 9中,我需要将头文件path添加到Header Search Paths构build设置,而不是User Header Search Paths

Xcode会追加User Header Search Paths以编译命令作为-iquote选项,但将Header Search Paths附加为-I选项。 这是关键的区别。