【clion】多個main方法&命令行輸出中文亂碼

多個main方法的解決辦法

1.用add_executable添加可執行文件

每次創建一個cpp文件之後,在CMakeLists.txt文件中,添加新行

add_executable(main main.cpp)
# 每次新建一個cpp文件,就新加一行
add_executable(main2 main2.cpp)

不過這樣比較麻煩,尤其是在刷oj時,每次新建cpp文件都要手動添加新行。

2.自動生成可執行文件

在CMakeLists.txt文件中,添加以下內容

# 遍歷項目根目錄下所有的 .cpp 文件
file (GLOB_RECURSE files *.cpp)
foreach (file ${files})
string(REGEX REPLACE ".+/(.+)\\..*" "\\1" exe ${file})
add_executable (${exe} ${file})
message (\ \ \ \ --\ src/${exe}.cpp\ will\ be\ compiled\ to\ bin/${exe})
endforeach ()

但是這樣處理會有兩個問題

問題一

如果一個main.cpp文件中需要導入foo.h,那麼這個main.cpp編譯之後是找不到foo.h文件的,對於main文件中依賴其它文件的,需要手動添加

add_executable(main main.cpp foo.h foo.cpp)

所以比較合適的辦法是,對於需要依賴其它文件的(這裏指的其他文件指自己編寫的其他文件,並非庫文件,庫文件還是可以找到的),我們手動添加到CMakeLists.txt文件中,對於單個文件,就讓CMake自動生成可執行文件即可。

但是上面的自動生成可執行文件,是會掃描所有的cpp文件,如何讓cmake根據幾級目錄判斷是否自動生成呢?

# 只會遍歷根目錄下的cpp文件,不會遍歷根目錄下的二級目錄。
file (GLOB files *.cpp)

# 遍歷項目根目錄及二級目錄下所有的 .cpp 文件
file (GLOB files *.cpp */*.cpp)

# 遍歷根目錄,二級目錄,三級目錄下所有的.cpp文件
file (GLOB files *.cpp */*.cpp */*/*.cpp)

# 後面的都類似
# ...

這樣,僅需要調整file (GLOB files *.cpp */*.cpp */*/*.cpp) 中搜索到多少級目錄,這些cpp文件就會自動生成可執行文件,而對於需要依賴其它文件的,我們就手動加入CMakeLists.txt文件即可。

當然,你也可以把*換成特定的目錄,即僅對特定目錄配置自動生成可執行文件

問題二

由於所有的cpp文件都是自動生成可執行文件的,所以在修改了cpp文件的文件名時,再此運行該cpp文件會報錯。

舉個例子:

原來的cpp文件名稱爲ex1_23.cpp

之後我把cpp文件的名稱修改爲ex1_23_sales_item_manage.cpp

再次運行這個文件,就會報以下錯誤

mingw32-make.exe[3]: *** No rule to make target '../c++primer/ch01/ex1_23.cpp', needed by 'CMakeFiles/ex1_23.dir/c++primer/ch01/ex1_23.cpp.obj'.  Stop.
mingw32-make.exe[2]: *** [CMakeFiles\Makefile2:1136: CMakeFiles/ex1_23.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:1143: CMakeFiles/ex1_23.dir/rule] Error 2
mingw32-make.exe: *** [Makefile:305: ex1_23] Error 2

出現這個錯誤的原因是,沒有reload cmake project

clion中新建的cpp文件,如果要讓他可執行,就需要添加一條add_executable (${exe} ${file})記錄,而每次添加這樣一條記錄之後,如果開啓了自動重新加載cmake項目(clion根據CMakeLists.txt文件是否發生修改來判斷是否需要重新加載cmake項目),那麼這個文件就可以用於生成可執行文件。換句話說,如果修改了cpp文件名之後,沒有及時的重新加載cmake project,那麼新文件就不會生成可執行文件。

這個問題比較好解決,每次修改文件名之後,重新加載cmake project即可,

在file=》reload cmake project選項中或者cmake選項卡中選擇重新加載

也可以double shift,然後輸入reload即可選擇reload cmake project

以上問題僅在修改已有的cpp文件的文件名時會出現,對於修改cpp文件內容並不會出現這個問題。
新建cpp文件之後也需要reload cmake project

命令行輸出中文亂碼

clion中的項目文件編碼都是默認utf-8,mingw經過編譯處理之後生成的文件也是utf-8,但是cmd默認按照gbk編碼處理。

在main方法中添加以下代碼即可解決問題。

system("chcp 65001"); //爲了解決命令行顯示中文亂碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章