zoukankan      html  css  js  c++  java
  • 【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"); //为了解决命令行显示中文乱码
    
  • 相关阅读:
    C# 中的委托和事件
    C# 托管资源和非托管资源
    .NET Core 2.0
    PyQt5教程——事件和信号(5)
    PyQt5教程——布局管理(4)
    PyQt5教程——菜单和工具栏(3)
    PyQt5教程——第一个程序(2)
    PyQt5教程——介绍(1)
    如何通过 GitLab 进行在Azure WebApp中持续部署
    如何检测 Azure Web 应用沙盒环境文件系统存储量
  • 原文地址:https://www.cnblogs.com/ericling/p/15603580.html
Copyright © 2011-2022 走看看