我在命令行下写C++程序-Windows平台下的GCC编译环境-Mingw64

在windows平台下学习C/C++.多数人会选择IDE,如Visual Studio,Dev C++等等
VC社区版本的体积大,而且安装好漫长,要等好几个世纪,
但是学习语言,写个测试,写个hellowrold都要开个IDE,新建一个工程,然后再保存,这就是用牛刀杀鸡
更有甚者选择Turbo C,选择VC6,
这些都是在C++标准前就产生了,可以让你写出一些不标准的代码,很多最新的语言特性都不能很好的支持,甚至是错误的.
很多VC6的代码移植到新标准的编译器时常有一堆警告和错误.误人子弟

本着学习编程,从简单开始.就不要搞得太复杂.
写一个helloworld在IDE下要建立项目,保存然后再编译执行,这样在工程上折腾灵感都没了,
而且IDE一般会产生一堆中间文件,如VC的PDB,PCH非常占硬盘空间,
有没有一种方法更轻便更快的写代码的方式.
找寻数年,经过打磨,于是就有了这个工具集--解压一键设置完成,开箱即用
它可以让你在任意文件夹下编译生成执行文件,
可以编译windows平台的GUI/控制台软件,OpenGL,DirectX软件
最神奇的是你可以使用命令行中写代码,GDB调试代码
有图为证

运行方式,选定文件夹(没有空格括号,和其他特殊符号的文件夹),在地址栏运行 .cl直接进入命令环境,输入 touch  link.cpp即可创建link.cpp文件,如果源文件已存在,直接在地址栏输入cmd /c ' debug 即可编译并进入调试,cmd /c '只生成
 

进入.cl命令环境后,另外输入vim link.cpp进入VIM代码编辑环境
注:保存指令为esc+w,退出为esc+q,进入编辑状态i,撤销为:esc+u

GDB调试状态

gdb常用命令

l 列出当前代码
l +
l -
b 行号/函数名 断点
si 逐指令单步调试
s 单步
n 逐行
ni 逐行指令
f 跳出
r 运行
c 继续
i lo 局部变量
i b 断点信息
wa 变量 监控变量
d 序号 清队断点
set args 12 22 23 设置程序参数
show args 显示程序参数
set 变量=值
q 退出gdb

======================================================
自动化更新编译的命令行批处理脚本 '.cmd
 

@rem MinGW自动化编译工具集by wisepragma(https://blog.csdn.net/wisepragma)
@rem ...............参数说明....................
@rem clean  清除垃圾
@rem debug 调试版本,创建后运行GDB,中断到main
@rem release  命令行发布版本
@rem asm 生成调试版本,并创建汇编代码于asm文件夹
@rem gui 创建GUI版本
@rem  注:路径不支持空格,括号!会以文件夹名,作为执行文件,运行前会杀死进程,所以请不要以现有的进程命名文件夹如EXPLORER,CMD,SERVICES...
@rem ######################################
@cls
@echo off
@rem set start_cmd=%~nx0
@set BUILD_TYPE=%1
@set EXE_EXT=.exe
@rem ######################################
echo ++++++++++++++init cmdline+++++++++++++++++++++
@set CALLNEXT=YES
call 'cl.cmd
echo ++++++++++++++include directory++++++++++++++++
set C_INCLUDE_PATH
set CPLUS_INCLUDE_PATH
echo =================BURNING=======================
@rem  undefined reference to `__imp_..."请自行添加库,查看lib 文件夹,名字为libXYZ.a,记为-XYZ
@set library=-ld3d9 -lshlwapi -luuid -lws2_32 -lwinmm -lgdiplus -lsetupapi -lgdi32 -luser32 -lkernel32 -lcomctl32 -lcomdlg32 -lstdc++ -lpsapi -lopengl32

@rem ######################################

if /i "%BUILD_TYPE%" == "clean" (
     call .clean.cmd
     set tips= clean
     goto abort_label
 )

if "%BUILD_TYPE%" == "" (
     echo ^>^>^>^>^>^>^>^>^>^>^>^>^>^>DEFAULT EDITON^<^<^<^<^<^<^<^<^<^<^<^<^<^<^<^<
     rem set VERSION= -Wextra  -g  -O0  
     set VERSION= -Wextra  -s -Os
     set tips=default 
 )
if /i "%BUILD_TYPE%" == "DEBUG" (
     echo ^>^>^>^>^>^>^>^>^>^>^>^>^>^>DEBUG EDITON^<^<^<^<^<^<^<^<^<^<^<^<^<^<^<^<
     set VERSION= -Wextra  -g3  -gdwarf-3  -O0  
     set tips=debug 
 )
if /i "%BUILD_TYPE%" == "ASM" (
     echo ^>^>^>^>^>^>^>^>^>^>^>^>^>^>DEBUG EDITON^<^<^<^<^<^<^<^<^<^<^<^<^<^<^<^<
     @if not exist %PROJDIR%\asm (
     @echo obj folder is not exist, creating %PROJDIR%\asm...
     md %PROJDIR%\asm
   ) else (
        del /f /q %PROJDIR%\asm\*.asm
        call .clean.cmd
   )

     set VERSION= -Wextra  -g3  -gdwarf-3  -O0  
     set tips=%BUILD_TYPE%
 )
if /i "%BUILD_TYPE%" == "DASM" (
     echo ^>^>^>^>^>^>^>^>^>^>^>^>^>^>DEBUG EDITON^<^<^<^<^<^<^<^<^<^<^<^<^<^<^<^<
     @if not exist %PROJDIR%\asm (
     @echo obj folder is not exist, creating %PROJDIR%\asm...
     md %PROJDIR%\asm
   ) else (
        del /f /q %PROJDIR%\asm\*.asm
   )

     set VERSION= -Wextra  -g3  -gdwarf-3  -O0  
     set tips=%BUILD_TYPE%
 )


if /i "%BUILD_TYPE%" == "RELEASE" (
     echo ^>^>^>^>^>^>^>^>^>^>^>^>^>^>RELEASE EDITION^<^<^<^<^<^<^<^<^<^<^<^<^<^<^<^<
     set VERSION= -Wextra  -s -Os
      set tips=release
)
if /i "%BUILD_TYPE%" == "GUI" (
     echo ^>^>^>^>^>^>^>^>^>^>^>^>^>^>RELEASE EDITION^<^<^<^<^<^<^<^<^<^<^<^<^<^<^<^<
     set VERSION= -Wextra  -s -Os -mwindows 
     @rem -mconsole
      set tips=win gui 
)
@echo %tips% version %VERSION% 



rem 取得当前目录名作可执行文件名
@for %%i in (.) do set fileName=%%~ni
@set exeName=%fileName%%EXE_EXT%
@rem 杀死运行的进程,可执行文件名过长可能失败
echo kill "%exeName%"
tasklist | findstr /i "%fileName%"
if "%errorlevel%" == "0"  taskkill /f /im %exeName%


@if not exist %PROJDIR%\obj (
     @echo obj folder is not exist, creating %PROJDIR%\obj...
     md %PROJDIR%\obj
   )

@rem .h file update
echo off
@if not exist %exeName% (
     call .clean.cmd
     goto skip_h_update
)
echo ____________checking .h update___________________
@REM 以下脚本,是扫描所有.H文件,是否最新,根据最新的.H文件再扫描.rc,.c,.cpp是否包含,如是就编译
setlocal enabledelayedexpansion
@REM -------STATE0:SCAN .H-------------------
for /r  %%i in (*.h) do  ( 
        @rem echo %%~di
        @rem  ^>^>^>^>^>^>^<^<^<^<^<^<
        REM cmpt.exe srcfile,objfile
        REM compare the time of two files
        REM Tsrc > Tobj return 2:print srcfile
        REM Tsrc < Tobj return 1
        REM Tsrc = Tobj return 0
        REM parameter invalid return 4
        REM objfile invalid return 2:print srcfile
        
@rem -------  STATE1:check time if(.h  > exe)----------
         cmpt %%i %exeName% 
         if "!errorlevel!" == "2" (  
               for /r %%k in (*.rc) do  (
                  findstr /i "%%~nxi" %%k>>nul
                  if "!errorlevel!" == "0" (
                            @echo %%~nxi is new
                            @echo ....res burn [%%k]
                            windres.exe  -J rc -O coff  -i %%k  -o obj\%%~nk_res.o
                            @if "!ERRORLEVEL!" == "1" goto error_found
                                            )
                                         )
@rem -------  STATE2:check if(find .h name in .c files)----------
               for /r %%k in (*.c) do (
                  findstr /i "%%~nxi" %%k>>nul
                  if not "%%~xk" == ".c~"   (
                      if "!errorlevel!" == "0" (
@rem -------  STATE3:check time if(.h  > .o)----------
                        cmpt  %%i   obj\%%~nk.o 
                        if "!errorlevel!" == "2" (
                            @echo %%~nxi is new
                            @echo ....c burn [%%k]
                            gcc.exe -c  %%k -o obj\%%~nk.o   %VERSION% -Wall  -std=c11 %OTHER_OPTION%
                            @if "!ERRORLEVEL!" == "1" goto error_found
                                                  )
                                                )
                                             )
                                        )
@rem -------  STATE4:check if(find .h name in .cpp files)----------
                   for /r %%k in (*.cpp) do (
                        findstr /i "%%~nxi" %%k>>nul
                        if not "%%~xk" == ".cpp~" (
                            if "!errorlevel!" == "0" (
@rem -------  STATE5:check time if(.h  > .o)----------
                                cmpt  %%i   obj\%%~nk.o 
                                if "!errorlevel!" == "2" (
                                    @echo %%~nxi is new
                                    @echo ....cpp burn [%%k]
                                    g++.exe  -c %%k  -o obj\%%~nk.o  %VERSION% -Wall -std=c++11 %OTHER_OPTION% 
                                    @if "!ERRORLEVEL!" == "1" goto error_found
                                                          )
                                                       )
                                                    )                              
                                              )    
@rem ------- end STATE1----------
        ) 
@rem --------end STATE0----------
) 
endlocal
@rem ######################################
:skip_h_update
echo ____________skip .h update_______________________
echo off
setlocal enabledelayedexpansion
echo ____________compiling .rc file___________________
@rem -------  STATE6:check time if(.rc  > res.o)----------
for /r %%k in (*.rc) do (
     cmpt.exe  %%k obj\%%~nk_res.o
     if !errorlevel! == 2   (
        windres.exe  -J rc -O coff  -i %%k  -o obj\%%~nk_res.o
        @if "!ERRORLEVEL!" == "1" goto error_found
     )  ELSE (
@rem -------  STATE7:check time if(.ico  > res.o)----------
        for /r %%g in (*.ico) do (
              cmpt.exe  %%g obj\%%~nk_res.o
              if !errorlevel! == 2  (
                   windres.exe  -J rc -O coff  -i %%k  -o obj\%%~nk_res.o
                                    )
        )  
     )  
)      
@rem ######################################
echo ____________compiling .c file____________________
@rem -------  STATE8:check time if(.c > .o and skip vim files .c~)----------
for /r %%k in (*.c) do (
     if not "%%~xk" == ".c~"   (
        cmpt.exe  %%k obj\%%~nk.o 
        if !errorlevel! == 2   (
            if /i  "%BUILD_TYPE%" == "asm"  (
                  gcc.exe  %%k %VERSION% -Wall -std=c11   -c -o obj\%%~nk.o %OTHER_OPTION% -Wa,-adlhn -masm=intel> asm\%%~nk.asm
            ) else (
                  gcc.exe  %%k %VERSION% -Wall -std=c11   -c -o obj\%%~nk.o %OTHER_OPTION%
            )
            @if "!ERRORLEVEL!" == "1" goto error_found
        )
     )
)
@rem ######################################
echo ____________compiling .s file____________________
@rem -------  STATE9:check time if(.s > .o )----------
for /r %%k in (*.s) do (
     cmpt.exe  %%k obj\%%~nk.o 
     if !errorlevel! == 2   (
        if /i  "%BUILD_TYPE%" == "asm"  (
              g++.exe  %%k %VERSION% -Wall  -std=c++11   -c -o obj\%%~nk.o %OTHER_OPTION% -Wa,-adlhn -masm=intel> asm\%%~nk.asm
        ) else (
              g++.exe  %%k %VERSION% -Wall  -std=c++11   -c -o obj\%%~nk.o %OTHER_OPTION%
        )
        @if "!ERRORLEVEL!" == "1" goto error_found
     )      
)      
@rem ######################################
echo ____________compiling .cpp file__________________
@rem -------  STATE10:check time if(.cpp > .o and skip vim files .cpp~)----------
for /r %%k in (*.cpp) do (
    if not "%%~xk" == ".cpp~"     (
        cmpt.exe  %%k obj\%%~nk.o 
        if !errorlevel! == 2   (
            if /i  "%BUILD_TYPE%" == "asm"  (
                    g++.exe  %%k %VERSION% -Wall  -std=c++11   -c -o obj\%%~nk.o %OTHER_OPTION%  -Wa,-adlhn -masm=intel> asm\%%~nk.asm
            ) else (
                    g++.exe  %%k %VERSION% -Wall  -std=c++11   -c -o obj\%%~nk.o %OTHER_OPTION%
            )
            @if "!ERRORLEVEL!" == "1" goto error_found
        )      
    )  
)
endlocal
@rem ######################################
echo ____________linking______________________________
gcc.exe  obj\*.o -o %exeName%   %VERSION% -std=c++11 %library% -static
@if "%ERRORLEVEL%" == "1" goto error_found
@echo ____________generate hex,bin,exe_________________

@rem ######################################
@rem =============debug or lanugh=====================
@rem _gdbsvr.cmd %exeName%,%BMAIN%
@rem  echo  ver:%tip% %BUILD_TYPE% %exeName%
kill_cmd.exe
@rem -------  STATE11:check exe file  for runing or debuging----------
if exist %exeName% (
    if /i  "%BUILD_TYPE%" == "DASM"  (
        echo generating %fileName%_dump.asm
        objdump  -Mintel -S  "%exeName%" >asm\%fileName%_dump.asm
    )
     @echo  file size
     size.exe %exeName% 
     filesize.exe %exeName% 
     if /i "%BUILD_TYPE%" == "DEBUG" (
          echo start debuging %exeName%...
          gdb.exe     %exeName%  -ex "start"
     ) else (
          @echo ____________launching "%exeName%"_______________
          if "%BUILD_TYPE%" == "GUI"  (
               start %exeName%
          ) else (
               %exeName%
               cmd /k
               exit
          )
     )
)
@rem ######################################
@rem =============debug or lanugh=====================
cmd /k
if "%CALLNEXT%" ==""  cmd /k
exit

:error_found
@echo ERROR:something wrong happened!!!
kill_cmd.exe
pause

:abort_label
@rem COLOR F0
kill_cmd.exe
cmd /k
exit
@rem __________________________________________________________

======================================================
命令行环境设置脚本'cl.cmd
 

@rem 此批处理设置环境
@rem 输入参数:PNTRK_64指定到编译器目录下的cmdline目录 
@title [mingw64][current:%cd%]
@echo off
@rem PROMPT $l$t $g
ECHO %DATE% %TIME% LUCKY NUMBER:%RANDOM%
ECHO This cmd line script written by wisepragma @http://blog.csdn.net/wisepragma
PROMPT $g
echo +++++++++++GNU Tool Chain[mingw64 EDITION]++++++++++++++++
@rem color 0a
@rem color f6
@rem color 8e
@rem color f0
@color 0e
@rem ..................................................................................................................
set PROJDIR=%CD%
set COMPILER_DIR=%PNTRK_64%

echo compiler dir:%COMPILER_DIR%

if not exist %COMPILER_DIR% (
     echo TOOL CHAIN NOT FOUND
     goto err_theend
)
echo setting enveriment... 
set xhome=%PROJDIR%\
@rem fixed "The input line is too long." issue,because of adding PATH too long
set path |find "%COMPILER_DIR%\bin"
if "%errorlevel%" == "0" goto skip_add_path
@echo adding path
set PATH=%COMPILER_DIR%\add\np;%PROJDIR%;%COMPILER_DIR%\bin;%COMPILER_DIR%\add;%path%;%COMPILER_DIR%\add\gvim;%COMPILER_DIR%\add\greenfish;%COMPILER_DIR%\add\ResEdit;
@echo .........................................................
:skip_add_path
@rem echo %path%
@rem __________inc for gcc__________
@rem set C_INCLUDE_PATH=
@rem __________inc for g++___________
@rem set  CPLUS_INCLUDE_PATH=
@rem LIBRARY_PATH  .a  static lib
@rem LD_LIBRARY_PATH .so shared lib
set LIBRARY_PATH=%COMPILER_DIR%\arm-none-eabi\lib 
set LD_LIBRARY_PATH=%COMPILER_DIR%\arm-none-eabi\lib 

@rem ----------------以下 指令将工程目录下所有文件加入include目录---------------------------------
@rem ============使用C++编译的程序来输出目录列表,再输入到变量中==================================
@rem 路径不能太多,或者太深,因为命令行最大长度2047
@rem 一个执行文件的输出字符串作入另一个执行文件的输入,listdir.exe罗列出所有子目录,并以分号分隔输出
@rem dir /b /s /r /ad
for /f  %%i in ('listdir.exe') do set C_INCLUDE_PATH=%%i
@rem for /f  %%i in ('listdir.exe') do set CPLUS_INCLUDE_PATH=%%i
set CPLUS_INCLUDE_PATH=%C_INCLUDE_PATH%
echo.
echo Ready!
if "%CALLNEXT%" ==""  cmd /k

========================================================

本工具集包含Mingw-w64编译器,gvim,notepad2,notepad++,make,gdb

同时加入自动化批处理设置环境变量,自动编译目录下所有文件,比较相应日期增量编译

文件来源

mingw-w64/x86_64-win32-seh

https://sourceforge.net/projects/mingw-w64/files/

gvim/PC: MS-DOS and MS-Windows

https://www.vim.org/download.php

Mingw-w64与Mingw的区别:https://blog.csdn.net/whatday/article/details/87113007

链接:https://pan.baidu.com/s/1d7XTc7FCK994R0Deq7BdMA 
提取码:3fnl 

文件名称:mingw64_8.1.0-key[wisepragma].zip
文件大小:205299129 字节
修改时间:2019年10月24日 23:34:16
MD5     :7954C93C497ED1133187F8D87793186C
SHA1    :85D0B2DA124F6E3A006411D5576A23BC538CE0DD
CRC32   :AA4F5FAA
=================================================

说明 
1..解压压缩包到一个无空格,无括号,无中文,无特殊文字的路径
2.以管理员方式运行 AUTO_REG64.cmd,确认路径是不是正常,然后回车,此过程中会弹出,系统环境变量设置窗口,此动作可使变量立即生效,以上动作注册编译器的环境变量到系统path中,如果有错误发生,请打开目录下的path备份文件BACK_UP_PATH.TXT,复制path还原回去
3.完成 
'.cmd 以当前的目录为工程路径编译,会以当前目录名作为生成可执行文件名,并加入所有子目录加包含文件中,所以子目录不要太多
.cl.cmd编译器环境设置命令行
.clean.cmd 清除编译中间文件,( '.cmd clean  即调用此批处理)
jcd.cmd 打开路径
ls.cmd 列出文件
pwd.cmd 显示路径 
touch.cmd 创建文件
cat.cmd 显示文件

在命令行中加入参数
' clean 清除中间文件
' debug 编译完成后,启动gdb调试
' release 生成发布版本
' asm  重新编译,生成各个文件的汇编
' dasm 从可执行文件中生成反汇编
' gui  生成windows图形版本程序
'  生成默认版本/release

附加工具
n2 notepad2
np nopepad++
astyle   *.cpp --recursive  --style=bsd  --convert-tabs --indent=spaces=8 --attach-closing-while  --indent-switches  --indent-namespaces --indent-continuation=4 --indent-preproc-block --indent-preproc-define --indent-preproc-cond --indent-col1-comments --pad-oper   --pad-paren-in   --unpad-paren  --delete-empty-lines --align-pointer=name    --align-reference=name --break-elseifs  --add-braces 
make
gife32/gife64
vim/gvim
resedit
___________________________________________________
(by wisepragma)  https://blog.csdn.net/wisepragma

https://developer.arm.com/open-source/gnu-toolchain/gnu-rm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值