【问题标题】:How to include Apple 'frameworks' on Eclipse CDT如何在 Eclipse CDT 中包含 Apple 的“框架”
【发布时间】:2011-11-09 15:32:24
【问题描述】:

作为another question 的后续行动,我最近问过,我意识到我的问题是我不知道如何在 Eclipse CDT 项目属性中包含 Apple“框架”,以便在编译时获取并链接它们时间。

这会导致无法解析此表单中的包含:

#include <OpenCL/cl.h>

实际路径类似于:

/System/Library/Frameworks/OpenCL.framework/Versions/A/Headers

命令行选项是(如果我手动编译的话):

-framework OpenCL

总结:如何让 Eclipse 从项目属性中查看我想要的框架?

非常感谢任何帮助!

【问题讨论】:

  • 你能编辑工具链并添加框架头和lib目录吗?
  • 我是 eclipse cdt 的菜鸟 - 我该怎么做?我在项目属性中看到了一个工具链编辑器,但我看不到如何从那里添加这些东西
  • 尝试项目属性 > C/C++ 常规 > 路径和符号。
  • 是的,我可以通过“路径和符号”(指定完整路径)将路径添加到标题,但它没有解决“框架”的问题(它特定于 OSX 处理框架的方式)所以当您#include 时,它仍然无法解析符号等
  • 嗯,如果您使用的是 Apple 工具链,那么编译器有一个 -iframework 选项;如果你设置它有帮助吗?

标签: c++ macos eclipse-cdt


【解决方案1】:

JohnIdol 答案的替代答案。特别是,一种可以在您不想将&lt;OpenCL/cl.h&gt; 引用更改为&lt;cl.h&gt; 的情况下工作的方法

首先,我带着正是这个问题来到该网站(如何在 Eclipse CDT (C/C++) 项目中包含 Apple 的“框架”),我非常感谢讨论 - 它给出了我是一个起点。

John 的回答很酷,但它确实涉及更改包含文件的调用方式(例如,&lt;OpenCL/cl.h&gt; 在代码中变为 &lt;cl.h&gt;)。然后他在 eclipse 属性中为他需要的每个 Header 目录做一个直接的包含路径引用。

就我而言,我已经签出 GNU Backgammon 来玩弄源代码。此代码使用-framework 选项的 I-guess-standard apple 方法在 OS X CLI 环境中编译(在执行 autogen.sh 之前对 LDFLAGS 和 CPPFLAGS 进行一些修改),并包含文件引用,例如 #include &lt;CoreAudio/CoreAudioTypes.h&gt;

我可能永远不会真正提交任何东西,但我不想开始破解代码中的#includes,这些代码已经使用标准方法编译得很好。所以我做了以下事情:

  1. 在我的工作区 gnubg 中创建了一个名为“Frameworks”的新目录。
  2. 在该目录中,对头目录进行软链接。

    ln -s /System/Library/Frameworks/CoreAudio.framework/Headers CoreAudio
    
  3. 在 gnubg 项目属性 > C/C++ 常规 > 路径和符号中,将 /gnubg/Frameworks 添加到包含目录(作为工作区路径)。无论我创建了多少软链接,我只需要这样做一次。

这样我根本不用修改代码,Eclipse 很开心,CLI 编译也很开心。

我注意到,如果在框架中使用某些目录(例如 CoreServices.framework),会出现轻微的问题。在这些情况下,某些包含文件(例如,..)中有一个框架子目录和相对路径引用到其他包含文件。所以在这种情况下,我不得不稍微修改一下程序。基本上,我必须在 Frameworks 中为 CoreServices.framework 添加一个额外的子目录,然后在该目录中我必须添加 两个 软链接。一个用于 CoreServices(用于 Headers),一个用于 Framework 子目录。

lrwxr-xr-x  1 dhansen  staff    57B Jul 27 02:06 CoreServices -> /System/Library/Frameworks/CoreServices.framework/Headers
lrwxr-xr-x  1 dhansen  staff    60B Jul 27 02:05 Frameworks -> /System/Library/Frameworks/CoreServices.framework/Frameworks

然后我必须将 /gnubg/Frameworks/CoreServices.framework 添加到包含路径(上面的第 3 步)。
就是这样。不再有包含文件问题。

【讨论】:

    【解决方案2】:

    由于当前的 Eclipse CDT 版本没有正确执行子框架头包含,您可以通过创建指向每个子框架的包含目录的符号链接来避免子框架问题(例如由 CoreServices 头文件生成的问题)。我在下面的帖子中详细阐述了这个源于danhan回答的主题:

    http://thegreyblog.blogspot.com/2014/02/how-to-include-apple-frameworks-headers.html

    为了自动化这个过程,我创建了一个 Z shell 脚本来自动化这个过程并创建到指定框架的头目录的符号链接,以及到每个子框架的包含目录的链接.该脚本可以在这里找到:https://github.com/emcrisostomo/link-osx-framework-headers

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      好的,所以我必须像这样包含:

      #include <cl.h>
      

      然后在 Properties > C/C++ General > Paths and Symbols 中将包含头文件的文件夹添加到文件夹中,从而为编译器生成以下选项:

      -I/System/Library/Frameworks/OpenCL.framework/Versions/A/Headers
      

      而且,最值得注意的是,必须在 Properties > C/C++ Build > Settings 下为库路径和框架包含添加以下选项:

      -L/System/Library/Frameworks/OpenCL.framework/Versions/A/Libraries -framework OpenCL
      

      以上方法成功了。

      【讨论】:

        【解决方案4】:

        转到您的项目>属性>MacOS X C++ 链接器>命令 其中“g++”添加“-framework OpenCL”

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-01
          • 2017-05-27
          • 2014-02-08
          • 2021-05-16
          • 2011-04-01
          • 2011-05-27
          • 1970-01-01
          • 2010-09-28
          相关资源
          最近更新 更多