天天看點

makefile同時指定多個同名頭檔案/庫檔案, 那實際到底采用的是哪個呢?

         雖然是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了

        弄懂了上述問題, 對實際開發還是很有幫助的, 以免被迷惑。

繼續閱讀