Visual Studio 的 Linux Makefile 專案

| | 0 Comments| 08:59
Categories:

之前講的 Linux 的 MSBuild 專案,在設定和使用上其實都和本來 Windows 的 C++ 專案相當接近,所以對於習慣的人來說應該也很好理解。

但是,如果本來在 Linux 環境就已經寫好 Makefile 了,那要怎麼用 Visual Studio 來管理、偵錯呢?這時候,可以考慮使用 MSBuild 的 Makefile 專案。

要建立這樣的專案,可以在 Visual Studio 建立新專案的時候,選擇 C++ Linux 環境下的「Makefile 專案」;或是在建立了一個 C++ Linux 的空白專案後,再進去修改「組態類型」也可以。

而由於 Makefile 的本質就是自己定義整個建置的流程、所以實際上在架構、設定、使用上都和之前 Visual Studio 一般的專案有相當大的不同。而官方也沒有找到比較完整的說明,所以這邊大部分的東西都算是自己玩出來的了…


專案的檔案

由於 Visual Studio 的 Makefile 專案算是 remote Linux 的類型,所以會需要把檔案複製到遠端的 Linux 伺服器來進行建置。

而他會複製的檔案,只有專案內的檔案(專案檔 .vcxproj 不會複製過去),所以和建置相關的檔案,都必須要手動加入專案內;像是 Makefile 本身就得拉進專案裡面。

此外,考量到 Visual Studio 對於遠端檔案的處理方法是以專案為主,所以專案裡面應該也只能加入專案資料夾下的檔案。


Makefile 專案基本設定

其實 Visual Studio 的 Makefile 專案,主要就是去呼叫「make」來進行建置,所以其實對於建置的流程、參數,都沒有多大的調整空間;也因此,他的專案屬性裡面的設定,和標準的專案比起來算是相對很少的。

下面就是他「一般」裡面的選項,基本上主要要改的大概就是遠端複製路徑、還有遠端組件電腦了吧?

而這邊比較討厭的,是這個形式的專案沒有直接整合 WSL,所以如果要用 WSL 來建置的話,就需要在 WSL 的環境中架設 SSH Server、當作一般 Linux 伺服器才行。

在「C/C++」的部分,其實調整的主要是「IntelliSense」的部分,會影響程式碼的分析、但是不會影響到建置的過程。

比如說它這邊預設是 C++11,那如果在程式碼裡面用了比較新的語法,在編輯器裡面就會覺得你的語法有問題、會有 IntelliSense 的錯誤或警告;但是只要 Makefile 裡面有正確指定 C++ 標準,就還是可以正確編譯。

所以比較理想的情況,是自己去確認 Makefile 裡面編譯的標準和 Visual Studio 專案的設定是相同的會比較好。

而 Heresy 自己的認知中,這邊一定得改的,應該是「遠端組建」的部分。

這邊主要就是要針對「建置」(build)、「重建」(rebuild)、「清除」(clean)這三個動作、指定在 Linux 環境下要執行的指令。像是這邊就先很簡單地用「make」和「make clean」來玩了~

而理論上,應該是需要針對 debug / release 這兩種情境、設定不同的 make 目標、來切換不同的編譯參數就是了。

所以其實感覺上…就算不是使用 make、而是使用其他的建置系統,應該還是可以使用 Makefile 專案來玩的。

另外,這邊也可以看到,除了「遠端組建」外,還有一個「組建」也有同樣的參數可以設定;實際上「組建」是的設定是設計成先在 Windows 上執行指定的指令後、再去執行「遠端組建」中針對 Linux 指定的指令的。

所以如果有部分建置的前處理工作室可以在 Windows 上執行的話,其實應該是可以加在這邊的。


偵錯

由於 Makefile 最後的輸出相對彈性、一個專案就可以建置出許多東西,Visual Studio 也沒辦法判斷最後要對哪個程式偵錯,所以這邊都需要自己設定。

而在最簡單的狀況下,就是只指定「程式」了。像如果 Makefile 建置出來的執行檔是「test」的話,那這邊填入「test」就可以了。

而如果執行時有額外的參數的話,也可以加在「程式引數」,至於其他像是「工作目錄」這類的,也是可以視需要來設定。

這樣之後,就可以針對「test」這隻程式來進行執行、偵錯了~


既有的大型專案

到上面為止,基本上應該就算是可以建立出一個簡單的 Makefile 專案了~

不過在 Heresy 來看,對於既有的大型專案來說,最麻煩的事情,可能就是要怎麼樣才能把所有需要的檔案,都加到 Visual Studio 的 Makefile 專案裡了。

而且,Visual Studio 的 IDE 固然可以直接把資料夾拖進方案總管的專案裡面,但是他預設會加入的檔案會略為有限、僅會加入 .h 和 .cpp 這類明顯是程式碼的檔案,在某些情況下會有點麻煩;而更大的問題是,由於在方案總管裡面他不會去幫這些檔案分類,所以如果這樣加入大量的檔案,會讓方案總管裡面變得相當凌亂、難以處理。

所以,如果要處理這類的專案,應該是可以考慮先透過「方案總管」的「顯示所有檔案」的功能(也可以透過選單的「專案」、「顯示有檔案」),來切換到資料夾顯示模式。

點選這個選項後,方案總管就會改以資料夾的模式,來顯示專案目錄下的檔案了!

在這個介面下,就可以選取自己需要的資料夾、檔案,透過右鍵選單的「加入至專案」,來將大量的資料夾或檔案、一口氣加到專案裡面了~

而之後,在編輯、修改程式的時候,也可以透過這個模式來尋找自己需要的檔案;雖然會變成是以資料夾結構來管理、而且還會顯示大量非專案的檔案,但可能也算是一種相對比較方便的方案了。

不過這邊要注意的是,透過這樣的方法來將資料夾來加入的操作,Visual Studio 似乎還是只會加入他認為需要的檔案、並排除掉他認為不需要的檔案;例如 Heresy 這邊是發現像是 .o.props.ui.qrc.png.ico 等副檔名的檔案、還有沒有副檔名的檔案(例如 Makefile)似乎都會被排除,需要自己手動額外加入,這點算是比較麻煩的。

如果想要大量加入特定檔名、或特定副檔名的檔案,其實也還算簡單。只要在方案總管上方的搜尋框內、輸入要搜尋的檔名或副檔名,他就會在樹狀結構中列出這些檔案了;而這個時候只要透過 shift+左鍵來做範圍選擇,然後再透過右鍵選單的「加入至專案」,就可以完成加入的動作了。


附帶一提,Visual Studio 雖然在專案屬性裡面有提供「複製來源」(原文是「Copy Sources」、個人覺得翻譯不是很好),允許手動加入要複製到 Linux 環境的檔案,但是他卻只能每個檔案個別指定、似乎不能處理整個資料夾,所以實際上也不算實用。


現階段透過這樣的方法,基本上,這樣可能不是一個最好的 Linux 專案的開發方法,但是如果是對於比較習慣 Visual Studio、想要繼續用它來開發的人來說,這樣的使用方法或許會是一個比較可行的方案了?

不過實際上,這個方法真的要用在大型專案上,還是有不少缺點。目前覺得比較影響操作的:

  • 沒辦法進行單檔案編譯(Ctrl + F7)
  • 建置的錯誤訊息處理不佳
    • 連結階段的錯誤,似乎不會被獨立抓出來放到錯誤清單
    • 語法上的錯誤雖然會列在錯誤清單中,但是有的時候似乎沒辦法開啟對應的檔案
  • 沒有明確的指標可以看出目前建置的進度
  • 大型專案在重建的時候似乎會將所有檔案重新船第一次,建置前複製檔案的時間頗久、效率不佳。
  • 這樣的大型專案,如果實際上內部是有多個專案(例如多個執行檔)的話,由於沒辦法明確的區隔實際上的專案,所以:
    • 無法明確地要求僅重建特定專案
    • 要切換偵錯的目標比較麻煩

而這些基本上是因為 Visual Studio 不會實際去分析 Makefile 的建置目標的關係。但是考慮到 Makefile 裡面的寫法的彈性程度,老實說大概也不用期望 Visual Studio 能提供多好的分析了。 XD

Heresy 這邊現在也只想到可以這樣完,之後如果有找到比較好的方法,也會再來記錄一下的。


本系列目錄:

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *