【问题标题】:Macro undefined error while building a plugin构建插件时出现宏未定义错误
【发布时间】:2013-10-03 19:07:35
【问题描述】:

我正在开发一个插件,我需要在其中 #include 一个头文件(假设是 some_file.h),其中又包含 environ.h。现在,当我构建我的插件时,构建失败,environ.h 文件和其他一些依赖文件中有一些错误。这是来自 environ.h 的代码示例,其中发生了错误:

#ifndef PLATFORM
#ifdef WIN_ENV
#define PLATFORM "winpltfm.h"
#elif __OS2__
#define PLATFORM "os2pltfm.h"
#elif defined(unix) || defined(__unix)
 #define PLATFORM "UnixPlatform.h"
#else
#error You must define the PLATFORM macro     <------- Error-1
#endif
#endif

#include PLATFORM                             <------- Error-2

Error-1 是:#error you must define the platform macro,Error-2 很容易猜到:Expected &lt;filename&gt; or "filename"

奇怪的是,包含some_file.h 的其他一些插件工作正常,即构建成功。这让我觉得肯定有一些构建设置可能会有所不同。

任何人都可以建议在这种情况下应该做什么来从environ.h 头文件中删除错误吗?

注意:我正在 Xcode 中开发 MAC OS X。

【问题讨论】:

  • __OS2__ 没有得到定义。它是否期望由编译器定义?对于测试,您可以在 #include "environ.h" 之前添加 #define __OS2__,然后查看该翻译单元的问题。
  • Simple #define __OS2__ 开始抱怨更多。所以,我在包含some_file.h 之前添加了#define __OS2__ 1。现在,它显示os2pltfm.h file not found。这是 OSX 的标准文件吗?
  • 您缺少围绕__OS2__ 的定义,这就是为什么将其定义为1 的原因。我对 Xcode 不够熟悉,无法推荐解决方案,但您似乎需要将 os2pltfm.h 的路径传递给您的编译器。也是__OS2__ 的定义开关。
  • “切换为__OS2__”是什么意思?

标签: c++ macos macros cross-platform


【解决方案1】:

我继续我的cmets这个答案,所以更容易解释......

首先,应该是#elif defined(__OS2__) 而不是#elif __OS2__,这就是为什么在您的测试期间#define __OS2__ 不起作用,但#define __OS2__ 1 起作用。

编辑:从您的 cmets 中您注意到 environ.h 是一个标准文件,但他们检查 OS2 定义的方式似乎很奇怪。他们强迫它被定义为一个值,而不仅仅是被定义。

第二,从您的测试中可以看出,编译器没有为您定义 __OS2__,并且可能还有另一个标头,但当前未包含在翻译单元中拿起some_file.h。如果您已确认 OS2 未由项目中的另一个头文件定义,您可以按照SO answer 给出的以下步骤为预处理器定义一个宏:

您需要更改的构建设置称为“预处理器宏” 它可以在项目的“构建设置”选项卡中找到 设置窗格(使用搜索框查找)。选择每个目标 打开 Project Settings 窗格的左侧,然后修改 预处理器宏设置。

设置指定为以空格分隔的预处理器列表 'foo' 或 'foo=bar' 形式的宏。

第三,您的编译器设置中os2pltfm.h 的包含路径似乎错误或缺失。

您可以按照SO answer 中给出的说明包含该文件:

您所要做的就是将 -I 标志添加到您的构建设置中 “其他 C 标志”

所以在目标的构建设置中搜索“Other C Flags”并添加 -I/path-to-include/

【讨论】:

  • 这个(environ.h)是标准文件,所以我猜文件数据没有问题。编译器设置可能有问题。另外,我可以在任何地方获得这个os2pltfm.h 文件。我说的奇怪的是,在其他一些插件中包含some_file.h 没有任何抱怨。
  • 我在另一个插件中查找了预处理器宏,但找不到那里定义的这个特定宏..
  • 这些是你写的其他插件吗?还是第三方?如果它们是第三方,则作者可能将 OS2 定义作为参数添加到编译器,而不是实际将其放入代码中。这是使代码可移植的常见做法。
  • 是的,这些插件仅由我们的团队编写。所以,通过添加宏定义作为参数,你的意思是在构建设置中添加它,对吧?
  • 正确。如果我正确理解 XCode 的后端,它最终会变成 gcc/g++ 使用的 -D__OS2__ 开关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 2015-12-30
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 2011-11-27
相关资源
最近更新 更多