虛擬機通過掛載windows目錄編譯程序的問題

記一個問題的解決過程,從中正好回顧一下linux的相關知識。

問題是這樣的,有一份代碼在公司的服務器上編譯沒有問題,後來感覺經常要往服務器傳代碼編譯有點麻煩,就想在自己的虛擬機上搭建一個編譯環境。環境搭好之後,通過掛載的方式直接在虛擬機上訪問本地windows下的代碼進下編譯,編譯不過。

問題可以精簡成這樣,有一個cpp名叫Termios.cpp,其代碼包含了Termios.h這個頭文件,而Termios.h裏面包含了termios.h。Termios.cpp和Termios.h是自己的代碼,termios.h則是系統的頭文件,不要問我爲什麼用同一個名字,前人遺留代碼~~~。在Termios.cpp裏面使用了諸如B9600之類的宏,在虛擬機裏編譯的時候報錯找不到該宏的定義,但是在公司的服務器上編譯正常。搜索一下termios.h如下:(公司服務器和虛擬機結果大同小異)

判斷程序引用的是/usr/include/termios.h,打開該文件發現該文件包含了bits/termios.h,即/usr/include/x86_64-linux-gnu/bits/termios.h,在該文件中有對諸如B9600之類的宏定義。虛擬機裏面的文件內容也是這樣,那爲什麼編譯報錯呢?第一點懷疑虛擬機裏面程序包含的不是/usr/include/termios.h,通過在該頭文件中增加# error "qztest"這樣的打印內容確定了程序確實沒有包含該頭文件。難道是包含了其他目錄下的termios.h?通過gcc搜索路徑來看基本不可能(搜索路徑見我的這篇文章https://blog.csdn.net/wuzhidefeng/article/details/76854655),但是不放心,在其他目錄也加上了# error "qztest"這樣的宏發現也沒有包含這些頭文件。但是編譯的時候gcc並沒有提示找不到該頭文件,那程序到底是引用了哪兒的頭文件呢?

有用的命令來了,g++ -M這個命令。通過g++ -M Termios.cpp -I ../inc/ -I ../../globalinclude/ -std=c++11|grep termi單獨編譯一下這個cpp來看他到底使用了哪個頭文件,結果如下:

結果顯示他找到了../inc/termios.h,可是進入這個目錄只有Termios.h,並沒有termios.h這個文件啊。在該目錄ll以及find均找不到該文件,難道是gcc不區分大小寫?沒道理啊。嘗試將Termios.h copy一份成Termios1.h,然後在Termios.cpp裏包含Termios1.h,重新用g++ -M還是找到了../inc/termios.h。將termios.h重命名,重新編譯,之前加的# error "qztest"打印出來了。看來還是Termios.h被當成termios.h自包含了。

後來不通過掛載的方式,直接將整份代碼複製到虛擬機裏面重新編譯,沒有任何報錯,編譯成功。

結論:通過在ubuntu掛載訪問windows下的代碼,gcc編譯的時候會被誤導,不區分大小寫(具體深層次的原因待後面有空再深究了)

教訓:1、文件命名要規範,不要搞這種文件名一樣,只有大小寫不一樣的事,更不要和系統文件重名

           2、儘量不要跨平臺直接訪問文件,可以copy出來再訪問

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章