簡體   English   中英

gcc 如何在 Mac OSX(10.15) 上搜索框架標頭?

[英]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位於PrivateHeadersHeaders目錄中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM