簡體   English   中英

GCC 編譯器在查找 header 文件時不搜索子目錄

[英]GCC compiler does not search sub-directories when looking for header files

我無法讓 gcc 編譯器識別“包含”中的復雜路徑。

這是我的玩具“main.cpp”文件(注意包含語句中的子目錄):

#include "sub/testlib.h"

int main()
{
    testlib(6);
    return 0;
}

這是文件夾“main.cpp”中文件“testlib.h”的路徑:../lib/sub/testlib.h。

我在編譯時指定了包含目錄:

gcc -c -iquote../lib main.cpp

編譯器對我大喊:

main.cpp:1:10: fatal error: sub/testlib.h: No such file or directory
    1 | #include "sub/testlib.h"
      |          ^~~~~~~~~~~~~~~
compilation terminated.

當然,我可以通過從路徑中刪除子目錄來編譯它。 但這只是我在編譯實際項目失敗后所做的一個實驗。 我不能隨意更改那里的文件。

如何強制 gcc 很好地處理包含中的子目錄? 我在這里缺少標志或某些選項嗎?

如何強制 gcc 很好地處理包含中的子目錄? 我在這里缺少標志或某些選項嗎?

閱讀GCC的文檔,特別是Invoking GCC章節, 預處理器選項部分(例如-I include-dir-H-M等),預處理器文檔 也試試g++ --help -I包含目錄標志可以重復很多次,這可能是您需要的。 當然,arguments 到g++程序的順序很重要。 在編譯或鏈接 C++ 程序時,您可能希望使用g++而不是gcc

另請閱讀 C++ 的一些文檔(甚至可能是n3337 “草案”標准)。 注意翻譯單元,以及linker的作用。

在實踐中,您希望使用一些構建自動化工具(例如GNU makeninja或許多其他工具)來驅動 GCC 編譯。

如果您使用 GNU make ,請閱讀其 文檔,然后嘗試make -p ,它顯示了該軟件已知的許多內置規則。 請注意make許多功能

如果您使用ninja ,請閱讀其文檔,您可能想要生成它正在使用的build.ninja腳本。 您可以使用Python腳本或Guile腳本(或您自己的 C++ 程序等)生成它。

請注意,當然g++將調用一些 GNU binutils實用程序(例如,匯編器as或 linker ld )。

實際上,調用g++g++ -Wall -Wextra -g以獲取警告和調試信息(當然還有額外的-I包含目錄標志)。 然后使用gdb調試器 一旦您的程序幾乎沒有錯誤,請添加優化標志,例如-O2

另請參閱Clangstatic 分析儀Frama-CCompCert ,以及 2020 年底的Bismon

考慮在某些情況下生成一些#include -d C++ 代碼(例如,使用SWIGANTLRQt或您自己的腳本)或使用您的插件擴展 GCC。

當然要注意Joel 測試

暫無
暫無

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

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