在Objective-C中使用外部C ++头文件
在我的iOS项目中,我需要使用用C ++编写的外部库。 C ++头文件都在一个目录中。
我已经将这些C ++头文件添加到我的Xcode项目中,并且还指定了头文件searchpath(在“生成设置”中)。
问题是这些C ++头文件使用<>尖括号包含对方。 这导致:
'filename.h' file not found with <angled> include, use "quotes" instead.
奇怪的是Xcode不会抱怨所有的头文件。 同样的,包含在一个文件中的头文件是好的,而在另一个文件中包含的时候是一个问题。 我认为这是由于这些标题#包括对方的事实。
- 为什么searchpath不工作?
- 有没有办法解决这个问题,而不修改这些头文件?
谢谢!
#include <bla.h>
是用于标准库或框架头的,search策略与用于的不同
#include "bla.h"
看例如
- #include <filename>和#include“filename”有什么区别?
作为一种解决方法,您可以将Xcode构build设置“总是search用户path”设置为YES。
从“空白”应用程序项目开始:
-
在应用程序的项目中创build一个文件夹“Libraries” – 作为MyApp.xcodeproj文件的一个兄弟,最好在任何地方。 除非二进制是包含所有体系结构的通用二进制归档文件,否则为每个configuration(debugging,发布等)以及可能的每个体系结构(armv7,armv7s,arm64)创build子文件夹。
-
获取第三方库的头文件和静态库二进制文件(对于不同的平台,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
-
“库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。
-
“标题searchpath”构build设置:
给出这个例子,将下面的头部searchpath添加到Debug和Releaseconfiguration中:
debugging: 标题searchpath :
$(SRCROOT)/Libraries/Debug-iphoneos/include
发布: 标题searchpath :
$(SRCROOT)/Libraries/Release-iphoneos/include
同样,对于特定的configuration/目标对,您可能有不同的path – 尽pipe标头可能相同。
-
通过将
-lc++
添加到Other Linker Flags构build设置,将您的应用程序与C ++标准库链接起来 。 -
按如下所示在文件中导入标题:
#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
选项。 这是关键的区别。