在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