25

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

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

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

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

奇怪的是 Xcode 并没有抱怨所有的头文件。同样的标题#include'd 在一个文件中也很好,而在另一个文件中#include'd 时会出现问题。我认为这是由于这些标头#include 彼此造成的。

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

谢谢!

4

5 回答 5

42
#include <bla.h>

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

#include "bla.h"

参见例如

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

于 2013-07-04T09:28:25.793 回答
15

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

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

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

    例如,假设您有一个通用二进制文件(armv7、armv7s、arm64)以及该库的调试和发布版本: 现在,假设文件夹结构如下:

    $(SRCROOT)/Libraries
        Debug-iphoneos
            include
                ThirdParty
                    third_party.hh 
                    ...
            libThirdParty.a             
        Release-iphoneos
            include
                ThirdParty
                    third_party.hh 
                    ...
            libThirdParty.a             
    MyApp.xcodeproj            
    
  3. “图书馆搜索路径”构建设置:

    将“Libraries”文件夹拖到您的 Xcode 项目中。这可能会在构建设置中自动创建库搜索路径。请验证这一点,如果不正确,请修复它。

    给定示例,为调试和发布配置添加以下库搜索路径:

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

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

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

  4. “标题搜索路径”构建设置:

    给定示例,将以下标头搜索路径添加到调试和发布配置:

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

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

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

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

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

     #import <ThirdParty/third_party.hh>
    
于 2013-07-04T10:05:59.780 回答
4

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

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

于 2017-11-28T23:32:24.473 回答
0

在 XCode 中将“用户标题搜索路径”设置为指向您的库目录后,您还必须确保将名为“始终搜索用户路径”的字段设置为“是”

这解决了我遇到的问题:使用 <angled> 包含找不到 <boost/signals2.hpp> 文件,请改用“引号”。

于 2014-04-09T17:28:26.147 回答
0

我的 OSX / Mysql 两分钱。(顺便问一下,为什么在 mysql 中虚假使用 <> ......无论如何......)

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

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

我设置:

HEADER_SEARCH_PATHS = "/usr/local/mysql/include"。

链接器:

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

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

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

由于该库未签名。只需在 Entitlemens 中:

(在 XML 中):..

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

在此处输入图像描述

于 2020-02-08T20:35:34.063 回答