[英]Library tries to include <string.h> but includes “string.h” from my project, how to prevent?
我的項目中有一個string.h
使用-I
將其添加到我的標題搜索路徑中(因為我使用的是CMake並從項目根目錄而不是string.h
所在的目錄進行編譯)。
該項目使用一個外部庫,該庫嘗試在我包含的其中一個頭文件中#include <string.h>
(標准C頭),並且意外地最終包含了我的string.h
(因為它位於頭搜索路徑中) <>
包含在內)。
這是(已編輯的)錯誤消息,它揭示了這一點:
In file included from /path/to/project/src/random_source_file.cpp:3:
In file included from /usr/local/include/SDL2/SDL.h:67:
In file included from /usr/local/include/SDL2/SDL_main.h:25:
In file included from /usr/local/include/SDL2/SDL_stdinc.h:60:
In file included from /path/to/project/src/string.h:7:
etc.
在SDL_stdinc.h
的第60行,有#include <string.h>
。
我該如何解決?
我使用的2條規則:
1)我創建的包含文件始終通過相對路徑包含,而從未包含在環境PATH中。
#ifndef DTB_SUPPORT_HH
#include "../../bag/src/dtb_support.hh"
#endif
2)我僅通過環境PATH包含庫文件,而從未使用相對路徑。
#include <string>
編輯-來源:
我對“相對路徑”的使用來自以下經驗:
作為從事MLOC大小工作的承包商(幾百個承包商),我發現了將符號添加到簡單文件的原因,我們將其稱為“ Foo.hh”。
我使用他們的工具找到“ Foo.hh”,對其進行了修改,然后編輯了我正在使用的文件,以使用放置在此處的新符號。
但是,在重建期間,編譯器抱怨該符號未知。
因此,我仔細檢查了兩個文件,並意識到必須有另一個“ Foo.hh”。
然后,我啟動了整個系統的構建,並帶有使編譯器在編譯輸出中報告每個編譯單元包括的所有文件的選項(我認為-H?)。
最初,我只訪問了我感興趣的編譯單元,並找到了第二個“ Foo.hh”。
好奇心得到了我的最好的幫助,所以我翻閱了編譯日志,發現了成千上萬的“ Foo.hh”。 我必須將這些行收集在一起,並用完整的路徑對它們進行排序。
原來有5條路徑到達“ Foo.hh”。 比較它們,這5個文件具有3個不同的版本。
(僅供參考-我從第一個符號中刪除了我的符號,在第二個符號中添加了新符號,並且(按方向)忽略了其他三個文件。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.