最近在编译程序时,总是遇到一个重复编译的问题。理论上程序源代码并没有变动,但 make 程序却经常触发编译。在 AI 的帮助下,定位到了 g++ 头文件位置查找的一个诡异的顺序问题。
假设这个 C++代码test.cpp里面有一个 #include <util/test.hpp>。这个 util/test.hpp 位于./,而且也复制部署在 /opt目录下。
我们的编译脚本是:
g++ test.cpp -o test.o -I ./ -I /opt/ -isystem ./
猜猜最后引用的 util/test.hpp 是哪个文件?
准确答案是 /opt/util/test.hpp。
原因是 -isystem ./ 会将当前目录从 -I 中删除。最后 g++查找的顺序变成了 -i /opt/ -isystem ./。然后-i /opt/将被优选选中。
Q. E. D.