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

时间:2013-07-04 08:50:23

标签: c++ ios objective-c xcode include-path

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

我已将这些C ++标题添加到我的Xcode项目中,并且还指定了标题搜索路径(在构建设置中)。

问题是这些C ++标头包含彼此使用< >尖括号。这导致:

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

奇怪的是Xcode没有抱怨所有标题。同样在一个文件中包含#include'd标题也没问题,而#include在另一个文件中则是一个问题。我认为这是因为这些标题相互匹配。

  1. 为什么搜索路径不起作用?
  2. 有没有办法在不修改这些头文件的情况下解决这个问题?
  3. 谢谢!

5 个答案:

答案 0 :(得分:34)

#include <bla.h>

用于标准库或框架标头以及搜索策略 与用于

的不同
#include "bla.h"

参见例如

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

答案 1 :(得分:13)

从&#34;空白&#34;开始应用项目:

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

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

    例如,假设您拥有该库的通用二进制文件(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. &#34;图书馆搜索路径&#34;构建设置:

    拖动&#34;图书馆&#34;进入Xcode项目的文件夹。此可以在构建设置中自动创建库搜索路径。请验证这一点,如果不正确,请修复它。

    根据示例,为Debug和Release Configuration添加以下库搜索路径:

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

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

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

  4. &#34;标题搜索路径&#34;构建设置:

    给出示例,将以下标题搜索路径添加到Debug和Release Configuration:

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

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

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

  5. -lc++添加到其他链接标记构建设置,将您的应用与C ++标准库相关联。

  6. 按如下方式导入文件中的标题:

     #import <ThirdParty/third_party.hh>
    

答案 2 :(得分:3)

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

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

答案 3 :(得分:0)

在设置&#34;用户标题搜索路径&#34;之后的XCode中要指向您图书馆的目录,您还必须确保一个名为&#34;始终搜索用户路径&#34;的字段。设置为&#34;是&#34;

这解决了我遇到的问题:使用&lt; boost / signals2.hpp&gt;找不到文件&lt; angled&gt;包括,使用&#34;引用&#34;代替。

答案 4 :(得分:0)

我为OSX / Mysql支付2美分。 (顺便说一句,我问为什么在mysql中伪造了<>...。)

根据Xcode 11警告,“强烈建议禁用它。”

我更喜欢修补其他设置,将“始终搜索用户路径”保留为“否”。

我设置:

HEADER_SEARCH_PATHS =“ / usr / local / mysql / include”。

LINKER:

我) 如果出现链接错误,通常在“ / usr / local / mysql / lib”中添加“ libmysqlclient.a”,只需从Finder中拖动即可。

II:您可能会遇到最严重的错误...

“ / usr / local / lib / libmysqlclient.21.dylib:(/usr/local/lib/libmysqlclient.21.dylib)中的代码签名不适用于在使用库验证的过程中使用:映射过程和映射文件(非平台)具有不同的团队ID”

该lib未签名。只需在权利中:

(以XML格式): ..

<dict>
    <key>com.apple.security.cs.disable-library-validation</key>
    <true/>
</dict>
...

enter image description here