[英]How does gcc search framework headers on Mac OSX(10.15)?
通過gcc -v
我知道 gcc 在這些路徑中搜索:
/usr/local/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.3/include
/usr/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
/System/Library/Frameworks (framework directory)
/Library/Frameworks (framework directory)
我寫的:
#include <CoreFoundation/CoreFoundation.h>
int main() {
return 0;
}
它沒有給出錯誤信息。 但是使用以下代碼,gcc 找不到 header。
#include <CoreFoundation.framework/Headers/CoreFoundation.h>
int main() {
return 0;
}
我知道 gcc 在/System/Library/Frameworks
中找到 header CoreFoundation.h 。 /System/Library/Frameworks/CoreFoundation.framework/Headers/CoreFoundation.h
的路徑是 /System/Library/Frameworks/CoreFoundation.framework/Headers/CoreFoundation.h 。
我的問題是:為什么#include <CoreFoundation/CoreFoundation.h>
可以? 為什么不CoreFoundation.framework/Headers/CoreFoundation.h
(它給出錯誤消息)? 我認為應該是CoreFoundation.framework/Headers/CoreFoundation.h
,因為/System/Library/Frameworks/CoreFoundation.framework/Headers/CoreFoundation.h
的完整路徑是 /System/Library/Frameworks/CoreFoundation.framework/Headers/CoreFoundation.h ,並且包含路徑是/System/Library/Frameworks
。
提前致謝。
以下可能與此問題有關。
我編譯了一個包含“CoreServices/CoreServices.h”的文件。
did not find header 'CoreServices.h' in framework 'CoreServices' (loaded from '/System/Library/Frameworks')
然后我使用gcc -I /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/CoreServices.framework/
,因為我知道標題的路徑是/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/CoreServices.framework/Headers/CoreServices.h
。 但它仍然不起作用。 為什么?
gcc -v
output 中的兩行是關於與包含目錄不同處理的特殊目錄的提示。
/System/Library/Frameworks (framework directory)
/Library/Frameworks (framework directory)
Apple 的用於 Darwing 架構的 gcc 具有特殊的擴展,用於從框架中查找包含文件。 您可以閱讀有關達爾文選項的信息
特別是看 -Fdir 選項。 它允許指定除了上面列出的其他框架目錄。 此選項描述 gcc 如何在框架中查找 header 文件:
框架目錄是其中包含框架的目錄。 框架是一個目錄,其中直接包含
Headers
和/或PrivateHeaders
目錄,以.framework
結尾。 框架的名稱是該目錄的名稱,不包括.framework
。 與框架關聯的標頭位於這兩個目錄之一中,首先搜索標Headers
。 子框架是一個框架目錄,它位於框架的Frameworks
目錄中。 包含子框架標頭只能出現在包含子框架的框架的 header 或同級子框架 header 中。 如果兩個子框架出現在同一個框架中,則它們是兄弟框架。 子框架不應與框架同名; 如果違反,將發出警告。 目前一個子框架不能有子框架; 將來,該機制可能會擴展以支持這一點。 標准框架可以在/System/Library/Frameworks
和/Library/Frameworks
中找到。 示例包含類似於#include <Framework/header.h>
,其中Framework
表示框架的名稱,header.h
位於PrivateHeaders
或Headers
目錄中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.