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

mea*_*ers 19 c++ xcode objective-c include-path ios

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

我已经将这些C++标题添加到我的Xcode项目中,并且还指定了标题搜索路径(在Build Settings中).

问题是这些C++标头使用<>尖括号互相包含.这导致:

'filename.h' file not found with <angled> include, use "quotes" instead.
Run Code Online (Sandbox Code Playgroud)

奇怪的是,Xcode不会抱怨所有标题.同样在一个文件中包含#include'd标题也没问题,而#include在另一个文件中则是一个问题.我认为这是因为这些标题#include彼此.

  1. 为什么搜索路径不起作用?
  2. 有没有办法解决这个问题而不修改这些头文件?

谢谢!

Mar*_*n R 34

#include <bla.h>
Run Code Online (Sandbox Code Playgroud)

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

#include "bla.h"
Run Code Online (Sandbox Code Playgroud)

例如,参见

作为解决方法,您可以将Xcode构建设置"始终搜索用户路径"设置为YES.


Cou*_*per 13

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

  1. 在应用程序的项目中创建一个文件夹"Libraries" - 最好是作为MyApp.xcodeproj文件的兄弟,但它可以在任何地方.为每个配置(调试,发布等)创建子文件夹,并可能为每个体系结构(armv7,armv7s,arm64)创建子文件夹,除非二进制文件是包含所有体系结构的通用二进制存档.

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

    例如,假设您有一个通用二进制文件(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            
    
    Run Code Online (Sandbox Code Playgroud)
  3. "图书馆搜索路径"构建设置:

    将"Libraries"文件夹拖到Xcode项目中.这可以在构建设置中自动创建库搜索路径.请验证这一点,如果不正确,请进行修复.

    在给出示例的情况下,为Debug和Release Configuration添加以下库搜索路径:

    调试: 库搜索路径:$(SRCROOT)/Libraries/Debug-iphoneos

    发布:图书馆搜索路径:$(SRCROOT)/Libraries/Release-iphoneos

    对于特定的配置和目标平台对,您可能具有不同的库搜索路径.相应地在构建设置中设置不同的路径.

  4. "标头搜索路径"构建设置:

    在给出示例的情况下,将以下标头搜索路径添加到Debug和Release Configuration:

    调试:标头搜索路径:$(SRCROOT)/Libraries/Debug-iphoneos/include

    发布:标题搜索路径:$(SRCROOT)/Libraries/Release-iphoneos/include

    同样,对于特定的配置/目标对,您可能有不同的路径 - 尽管标头可能相同.

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

  6. 导入文件中的标题,如下所示:

     #import <ThirdParty/third_party.hh>
    
    Run Code Online (Sandbox Code Playgroud)


Pia*_*asy 6

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

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