雖然是10月8号了, 但仍然處在休假中, 這種感覺不錯。 為了避免節後綜合征導緻上班沒精神, 是以今天就開始在家玩玩代碼, 提前進入工作狀态。
今天, 我們來看看這樣一個問題:makefile同時指定多個同名頭檔案或庫檔案, 那實際到底采用的是哪個呢?
我們先說頭檔案。
在實際開發中, 一些公共的頭檔案, 經常被到處拷貝, 這是常有的事情, makefile中也經常重複指定同一頭檔案的包含, 那實際到底采用哪個呢? 我們來看看小實驗:
main.cpp内容為:
#include <iostream>
#include "test.h"
using namespace std;
int main()
{
cout << "begin" << endl;
test();
return 0;
}
目前目錄下有test1和test2檔案夾, test1中有test.h檔案, 内容為:
#include <iostream>
using namespace std;
void test()
{
cout << "test 1" << endl;
}
test2中也有test.h檔案, 内容為:
#include <iostream>
using namespace std;
void test()
{
cout << "test 2" << endl;
}
我們來看看編譯和運作結果:
g++ main.cpp -I ./test1 -I ./test2 && ./a.out
begin
test1
g++ main.cpp -I ./test2 -I ./test1 && ./a.out
begin
test2
可以看出, 先找到哪個就用哪個, 後面的被忽略。
那對于庫檔案呢? 我在實際開發中發現, 很多makefile編譯時, 經常包含同名庫檔案, 這也是亂拷貝的結果。 經我驗證發現, 實際用到哪個庫檔案也是根據makefile中程式員自己指定的先後順序來判斷的, 後面的庫檔案被忽略。
這裡提個問題: 如果是g++ main.cpp -I ./test1 -I ./test2, 那如果讓程式使用test2呢? 兩個方法:
1. 直接用test1覆寫test2.
2. 删除test1, 讓程式找不到它, 就自然去找test2了
弄懂了上述問題, 對實際開發還是很有幫助的, 以免被迷惑。