我是OSX的新手,我已经习惯了框架的工作方式。
在c ++项目中,当我想链接一个预安装的框架时,例如OpenGL.framework,我只需输入" -framework OpenGL"我很高兴。
另一方面,当我将一个新框架复制到例如/ Library / Frameworks中时,我去了#frame; -framework MyFramework",框架已链接但我需要手动包含头文件。
为什么会这样? Aren的头部应该已经在框架内吗? 为什么我需要将它们包含在某些框架中而不包含在其他框架中?
答案 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
编译器选项。