多个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"); //为了解决命令行显示中文乱码