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

Sai*_*2.0 1 macos frameworks header eclipse-cdt include

我是 OSX 新手,我正在习惯框架的工作方式。

在 C++ 项目中,当我想要链接预安装的框架(例如 OpenGL.framework)时,我只需输入“-framework OpenGL”即可。

另一方面,当我将新框架复制到例如 /Library/Frameworks 中时,然后我进入“-framework MyFramework”,该框架已链接,但我需要手动包含头文件。

为什么会这样呢?标题不是应该已经在框架内了吗?为什么我需要将它们包含在某些框架中而不是其他框架中?

Ret*_*adi 5

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

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

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

#incude <MyFramework/MyHeader.h>
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令编译源文件:

clang -F/Library/Frameworks foo.cpp -framework MyFramework
Run Code Online (Sandbox Code Playgroud)

请注意,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 以外的 SDK,请使用-isysroot编译器选项。