为什么我必须在Eclipse的某些OSX框架中专门包含头文件?

时间:2014-08-31 22:22:07

标签: macos frameworks header include eclipse-cdt

我是OSX的新手,我已经习惯了框架的工作方式。

在c ++项目中,当我想链接一个预安装的框架时,例如OpenGL.framework,我只需输入" -framework OpenGL"我很高兴。

另一方面,当我将一个新框架复制到例如/ Library / Frameworks中时,我去了#frame; -framework MyFramework",框架已链接但我需要手动包含头文件。

为什么会这样? Aren的头部应该已经在框架内吗? 为什么我需要将它们包含在某些框架中而不包含在其他框架中?

1 个答案:

答案 0 :(得分:3)

-framework是一个链接器选项。它对标题搜索路径没有影响。您可以通过尝试删除正在使用的系统框架的-framework选项来说服自己。您将看到仍然找到标题,但链接时将丢失符号错误。

-F选项可用于指定搜索框架标头的其他路径。例如,假设您有一个名为MyFramework的框架,其中包含标头MyHeader.h,并在/Library/Frameworks中安装此框架。然后可以在/Library/Frameworks/MyFramework/Headers/MyHeader.h找到标头,其中Headers是指向特定于版本的目录的符号链接。然后,标题的实际位置将是/Library/Frameworks/MyFramework/Versions/A/Headers/MyHeader.h

要包含此标头,源文件中的#include如下所示:

#incude <MyFramework/MyHeader.h>

您可以使用以下方法编译源文件:

clang -F/Library/Frameworks foo.cpp -framework MyFramework

请注意,Mac OS中系统框架的标头位置在几个版本之前发生了变化(我认为它是围绕Xcode 4开始的)。标头过去都在它们的框架目录中,这些目录大多位于/System/Library/Frameworks中,但情况不再如此。标题现在位于SDK目录中,这些目录是Xcode安装的一部分。

例如,对于Mac OS 10.9,框架标题位于/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks

除了将构建时使用的文件与运行时使用的文件分开外,这种较新的设置还具有以下优势:您可以拥有多个SDK,并且可以选择针对特定的SDK进行构建。要选择默认值以外的SDK,请使用-isysroot编译器选项。