【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"); //为了解决命令行显示中文乱码
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章