【问题标题】:XCode include system file instead of local fileXCode包含系统文件而不是本地文件
【发布时间】:2015-04-13 13:58:47
【问题描述】:

我正在开发一个 iOS 项目,并在我的一个文件中包含 ifaddrs.h

#include <ifaddrs.h>

最近,我的代码停止工作(特别是getifaddrs),我注意到BLWebSocketsServer 提供了getifaddrs.h/.c,这似乎会导致问题。如果我从 XCodes “Headers” 和 “Compile Sources” 阶段删除这两个文件,我的代码又开始工作了。

现在,我的问题:

  1. 为什么会发生这种情况? getifaddrs.h 不是 &lt;ifaddrs.h&gt;,所以这应该不会影响我的代码,不是吗?

  2. 有没有办法在不改变 BLWebSocketsServer 的情况下解决这个问题?

谢谢!

【问题讨论】:

    标签: c++ ios xcode compilation header-files


    【解决方案1】:

    查看BLWebSocketsServer中的getifaddrs.[hc],他们正在重新定义getifaddrs,因此系统实现被覆盖(并且#include基本上无关紧要)

    看起来您可以通过在编译器命令行(或在 Xcode 项目设置中的选项中)定义 HAVE_GETIFADDRS=1 来解决这个问题

    定义 HAVE_GETIFADDRS 在某种程度上等同于从编译阶段删除文件,但还有一个额外的好处是 BLWebSocketsServer 中的其他源不会使用可能无效的 getifaddrs 相关调用和结构声明。

    【讨论】:

    • 谢谢。我希望有一种无需定义预处理器宏的方法,但似乎没有:/
    • 嗯,随着您在项目中使用越来越多的开源和/或通用 Unix 源代码,您会发现这是一个非常常见的模型。如此之多,以至于有一个标准的 shell 脚本“配置”,其全部目的是在你的系统和编译器中搞砸,并找出需要哪些替代方法,哪些不需要。在这种情况下,并非所有的 unix 系统都支持getifaddrs,因此需要做出选择,支持多种迭代接口(有很多),或者将其全部隔离在原始的可选仿真之后。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 2012-05-30
    • 2019-03-13
    相关资源
    最近更新 更多