【编译器】【C语言】好多同学不会用C编译器,太可怕了。

曾经有位女同学问我,为什么从网上下载的 C 程序编译总出错,我自己写的就没有问题。

有一次,她把写好的程序给我看,我一看就感觉奇怪,明明是 cpp 文件,怎么全是 C 语法没有一句 C++ 语法。原来她新建了一个  C++ 工程,用来写 C 程序。C 和 C++ 语法是不同的,网上的程序如果是用标准 C 写的,你用 C++ 去编译,能不出错吗?

学校里的教学,都是有大纲的,超出大纲的东西是不会教的,这就要求我们自学。我以前也用集成开发环境写程序,后来看了大神的文章《完全用 Linux 工作》,改用 Ubuntu GCC 写程序,用终端命令行编译程序,渐渐学会写 shell,用来安装软件等简单工作,再后来返回 Windows,我开始编写 bat,这才深刻体会到,原来计算机应该这么用,完全可以自动化。

学计算机专业,就应该有较强的计算机操作能力,我教大家 GCC VC shell-bat 命令行编译方法,有详细注释,并打造 Visual_Studio_2015 绿色免安装版。好了,废话不多说,下面开始正题。

 

先在自己经常写 C 程序的路径下新建一个文件夹,名叫 0_Hello_World,打开文件夹,里面放置如下文件和文件夹:

.a.lib 里放置静态链接库,Linux 下扩展名是 .a,Windows 下扩展名是 .lib。

.so.dll 里放置动态链接库,Linux 下扩展名是 .so,Windows 下扩展名是 .dll。

build 是我们要编译程序的地方。

include 里放置需要的第三方头文件。

path 里放置指定编译器存放路径的文件。

    我的 path 里只有两个文件:

        mingw_x86-32bit.ini

            里面只有一行数据:

                C:\Qt\2010.04\mingw\bin

            这是我 Windows 下的 32 位 mingw-GCC 存放路径,mingw 一般都是绿色版,下载下来解压后直接用。

        Visual_Studio_2015.ini

            里面只有一行数据:

                E:\VS2015

            这是我 Windows 下的 Visual Studio 2015 绿色版的存放路径。

Linux 下的编译环境已经配置好了,基本不需要额外的配置。

src 里放置我们写好的 C 程序。

tool 里放置运行程序需要的文件,比如程序需要读取的数据,文本图片之类的文件。

 

接下来先看一下 Ubuntu Linux 下的命令行使用方法:

单击左上角“编辑” => “首选项”,

“行为” => 选择 "每次都询问",

如果要编译并运行程序,就双击 Ubuntu_GCC_编译运行.sh,

并选择 “在终端中运行”,

编译运行效果如下图所示:

Ubuntu_GCC_编译运行.sh 文件代码如下:

# 删除原有的 build 文件夹及里面的所有文件
rm -rf build
# 建立新的 build 文件夹
mkdir build
# 把自己的头文件复制到 build 文件夹
cp -rf ./include/* build
# 把自己的静态链接库复制到 build 文件夹
cp -rf ./.a.lib/* build
# 把自己的动态链接库复制到 build 文件夹
cp -rf ./.so.dll/* build
# 把自己的源文件件复制到 build 文件夹
cp -rf ./src/* build
# 把自己其它需要的工具复制到 build 文件夹
cp -rf ./tool/* build
# 进入 build 文件夹
cd build
# 显示 GCC 版本号
gcc -v
# 把 main.c 编译 成可执行文件 main,编译不同的程序,你需要修改的只有这一句
gcc main.c -o main
# 运行可执行文件 main,根据程序的不同运行环境可能需要添加其它命令
./main
# 程序运行结束后等待退出命令行
read -p "按回车键退出" var

如果只运行编译好的程序,就双击 Ubuntu_GCC_运行.sh,

Ubuntu_GCC_运行.sh 文件代码如下:

# 进入 build 文件夹
cd build
# 运行可执行文件 main,根据程序的不同运行环境可能需要添加其它命令
./main
# 程序运行结束后等待退出命令行
read -p "按回车键退出" var

接下来看一下 Windows 下的 32 位 mingw-GCC 编译运行命令行程序:

如果要编译并运行程序,就双击 mingw_x86-32bit_编译运行.bat,

mingw_x86-32bit_编译运行.bat 文件代码如下:

@echo off

:: 读取 path 文件夹内的文件 mingw_x86-32bit.ini 并将文件内容存入变量 sPath 中
@set /p sPath=<path\mingw_x86-32bit.ini
:: 将 mingw 安装路径加入到 PATH 环境变量里
@set PATH=%sPath%;%PATH%


:: 删除原有的 build 文件夹及里面的所有文件
@rd /s/q build
:: 建立新的 build 文件夹
@md build
:: 把自己的头文件复制到 build 文件夹
@xcopy include build /s /e /h
:: 把自己的静态链接库复制到 build 文件夹
@xcopy .a.lib build /s /e /h
:: 把自己的源文件件复制到 build 文件夹
@xcopy src build /s /e /h
:: 把自己其它需要的工具复制到 build 文件夹
@xcopy tool build /s /e /h

:: 进入 build 文件夹
@cd build
:: 将 .so.dll 文件夹加入到 PATH 环境变量里
@set PATH=..\.so.dll;%PATH%
:: 显示 GCC 版本号
@gcc.exe -v
:: 把 main.c 编译 成可执行文件 main.exe,编译不同的程序,你需要修改的只有这一句
@gcc.exe main.c -o main.exe
:: 运行可执行文件 main.exe,根据程序的不同运行环境可能需要添加其它命令
@main.exe
:: 程序运行结束后等待退出命令行
@pause

编译运行效果如下图所示:

如果只运行编译好的程序,就双击 mingw_x86-32bit_运行.bat,

mingw_x86-32bit_运行.bat 文件代码如下:

@echo off

:: 进入 build 文件夹
@cd build
:: 将 .so.dll 文件夹加入到 PATH 环境变量里
@set PATH=..\.so.dll;%PATH%
:: 运行可执行文件 main.exe,根据程序的不同运行环境可能需要添加其它命令
@main.exe
:: 程序运行结束后等待退出命令行
@pause

接下来看一下 Windows 下的 32 位 VC 编译运行命令行程序:

如果要编译并运行程序,就双击 Visual_Studio_2015_x86-32bit_编译运行.bat,

Visual_Studio_2015_x86-32bit_编译运行.bat 文件代码如下:

@echo off

:: 读取 path 文件夹内的文件 Visual_Studio_2015.ini 并将文件内容存入变量 sPath 中
@set /p sPath=<path\Visual_Studio_2015.ini

:: 推断出 Visual Studio 路径
@set VsDir=%sPath%\Microsoft Visual Studio 14.0
:: 推断出 SDK 路径
@set SdkDir=%sPath%\Microsoft SDKs
:: 推断出 Kit 路径
@set KitDir=%sPath%\Windows Kits
:: 推断出 MSBuild 路径
@set MsBuildDir=%sPath%\MSBuild
:: 推断出 .NET 路径
@set DotNetDir=%sPath%\Microsoft.NET
:: 推断出 HHW 路径
@set HtmlDir=%sPath%\HTML Help Workshop

::设置编译器 PATH 环境变量
@set PATH=%VsDir%\VC\BIN;%PATH%
@set PATH=%VsDir%\VC\VCPackages;%PATH%
@set PATH=%VsDir%\Common7\IDE;%PATH%
@set PATH=%VsDir%\Common7\IDE\Remote Debugger\x86;%PATH%
@set PATH=%VsDir%\Common7\IDE\CommonExtensions\Microsoft\TestWindow;%PATH%
@set PATH=%VsDir%\Common7\Tools;%PATH%
@set PATH=%VsDir%\Team Tools\Performance Tools;%PATH%
@set PATH=%SdkDir%\F#\4.0\Framework\v4.0;%PATH%
@set PATH=%SdkDir%\Windows\v10.0A\bin\NETFX 4.6 Tools;%PATH%
@set PATH=%KitDir%\Windows Kits\10\bin\x86;%PATH%
@set PATH=%MsBuildDir%\14.0\bin;%PATH%
@set PATH=%DotNetDir%\Framework\v4.0.30319;%PATH%
@set PATH=%HtmlDir%;%PATH%

::设置编译器 INCLUDE 环境变量
@set INCLUDE=%VsDir%\VC\INCLUDE;%INCLUDE%
@set INCLUDE=%VsDir%\VC\ATLMFC\INCLUDE;%INCLUDE%
@set INCLUDE=%KitDir%\10\include\10.0.10240.0\um;%INCLUDE%
@set INCLUDE=%KitDir%\10\include\10.0.10240.0\ucrt;%INCLUDE%
@set INCLUDE=%KitDir%\10\include\10.0.10240.0\winrt;%INCLUDE%
@set INCLUDE=%KitDir%\10\include\10.0.10240.0\shared;%INCLUDE%
@set INCLUDE=%KitDir%\NETFXSDK\4.6\include\um;%INCLUDE%

::设置编译器 LIB 环境变量
@set LIB=%VsDir%\VC\LIB;%LIB%
@set LIB=%VsDir%\VC\ATLMFC\LIB;%LIB%
@set LIB=%KitDir%\10\lib\10.0.10240.0\um\x86;%LIB%
@set LIB=%KitDir%\10\lib\10.0.10240.0\ucrt\x86;%LIB%
@set LIB=%KitDir%\NETFXSDK\4.6\lib\um\x86;%LIB%

::设置编译器 LIBPATH 环境变量
@set LIBPATH=%VsDir%\VC\LIB;%LIBPATH%
@set LIBPATH=%VsDir%\VC\ATLMFC\LIB;%LIBPATH%
@set LIBPATH=%SdkDir%\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs\14.0\References\CommonConfiguration\neutral;%LIBPATH%
@set LIBPATH=%KitDir%\10\References;%LIBPATH%
@set LIBPATH=%KitDir%\10\References\Windows.Foundation.UniversalApiContract\1.0.0.0;%LIBPATH%
@set LIBPATH=%KitDir%\10\References\Windows.Foundation.FoundationContract\1.0.0.0;%LIBPATH%
@set LIBPATH=%KitDir%\10\References\Windows.Networking.Connectivity.WwanContract\1.0.0.0;%LIBPATH%
@set LIBPATH=%KitDir%\10\UnionMetadata;%LIBPATH%
@set LIBPATH=%DotNetDir%\Framework\v4.0.30319;%LIBPATH%

:: 编译成 x86-32bit 程序
@set Platform=X86
:: 编译类型为原生编译
@set CommandPromptType=Native


:: 删除原有的 build 文件夹及里面的所有文件
@rd /s/q build
:: 建立新的 build 文件夹
@md build
:: 把自己的源文件件复制到 build 文件夹
@xcopy src build /s /e /h
:: 把自己其它需要的工具复制到 build 文件夹
@xcopy tool build /s /e /h

:: 进入 build 文件夹
@cd build
:: 将 .so.dll 文件夹加入到 PATH 环境变量里
@set PATH=..\.so.dll;%PATH%
:: 将 include 文件夹加入到 INCLUDE 环境变量里
@set INCLUDE=..\include;%INCLUDE%
:: 将 .a.lib 文件夹加入到 LIB 环境变量里
@set LIB=..\.a.lib;%LIB%
:: 将 .a.lib 文件夹加入到 LIBPATH 环境变量里
@set LIBPATH=..\.a.lib;%LIBPATH%
:: 把 main.c 编译 成可执行文件 main.exe,编译不同的程序,你需要修改的只有这一句
@cl.exe /EHsc main.c

::设置程序运行 PATH 环境变量
@set PATH=%VsDir%\VC\redist\x64\Microsoft.VC140.CRT;%PATH%
@set PATH=%VsDir%\VC\redist\x64\Microsoft.VC140.CXXAMP;%PATH%
@set PATH=%VsDir%\VC\redist\x64\Microsoft.VC140.MFC;%PATH%
@set PATH=%VsDir%\VC\redist\x64\Microsoft.VC140.MFCLOC;%PATH%
@set PATH=%VsDir%\VC\redist\x64\Microsoft.VC140.OpenMP;%PATH%
:: 运行可执行文件 main.exe,根据程序的不同运行环境可能需要添加其它命令
@main.exe
:: 程序运行结束后等待退出命令行
@pause

编译运行效果如下图所示:

如果只运行编译好的程序,就双击 Visual_Studio_2015_x86-32bit_运行.bat,

Visual_Studio_2015_x86-32bit_运行.bat 文件代码如下:

@echo off

:: 读取 path 文件夹内的文件 Visual_Studio_2015.ini 并将文件内容存入变量 sPath 中
@set /p sPath=<path\Visual_Studio_2015.ini

:: 推断出 Visual Studio 路径
@set VsDir=%sPath%\Microsoft Visual Studio 14.0
:: 推断出 SDK 路径
@set SdkDir=%sPath%\Microsoft SDKs
:: 推断出 Kit 路径
@set KitDir=%sPath%\Windows Kits
:: 推断出 MSBuild 路径
@set MsBuildDir=%sPath%\MSBuild
:: 推断出 .NET 路径
@set DotNetDir=%sPath%\Microsoft.NET
:: 推断出 HHW 路径
@set HtmlDir=%sPath%\HTML Help Workshop

:: 进入 build 文件夹
@cd build
:: 将 .so.dll 文件夹加入到 PATH 环境变量里
@set PATH=..\.so.dll;%PATH%

::设置程序运行 PATH 环境变量
@set PATH=%VsDir%\VC\redist\x86\Microsoft.VC140.CRT;%PATH%
@set PATH=%VsDir%\VC\redist\x86\Microsoft.VC140.CXXAMP;%PATH%
@set PATH=%VsDir%\VC\redist\x86\Microsoft.VC140.MFC;%PATH%
@set PATH=%VsDir%\VC\redist\x86\Microsoft.VC140.MFCLOC;%PATH%
@set PATH=%VsDir%\VC\redist\x86\Microsoft.VC140.OpenMP;%PATH%

:: 运行可执行文件 main.exe,根据程序的不同运行环境可能需要添加其它命令
@main.exe
:: 程序运行结束后等待退出命令行
@pause

接下来看一下 Windows 下的 64 位 VC 编译运行命令行程序:

如果要编译并运行程序,就双击 Visual_Studio_2015_x86-64bit_编译运行.bat,

Visual_Studio_2015_x86-64bit_编译运行.bat 文件代码如下:

@echo off

:: 读取 path 文件夹内的文件 Visual_Studio_2015.ini 并将文件内容存入变量 sPath 中
@set /p sPath=<path\Visual_Studio_2015.ini

:: 推断出 Visual Studio 路径
@set VsDir=%sPath%\Microsoft Visual Studio 14.0
:: 推断出 SDK 路径
@set SdkDir=%sPath%\Microsoft SDKs
:: 推断出 Kit 路径
@set KitDir=%sPath%\Windows Kits
:: 推断出 MSBuild 路径
@set MsBuildDir=%sPath%\MSBuild
:: 推断出 .NET 路径
@set DotNetDir=%sPath%\Microsoft.NET
:: 推断出 HHW 路径
@set HtmlDir=%sPath%\HTML Help Workshop

::设置编译器 PATH 环境变量
@set PATH=%VsDir%\VC\BIN\amd64;%PATH%
@set PATH=%VsDir%\VC\VCPackages;%PATH%
@set PATH=%VsDir%\Common7\IDE;%PATH%
@set PATH=%VsDir%\Common7\IDE\Remote Debugger\x64;%PATH%
@set PATH=%VsDir%\Common7\IDE\CommonExtensions\Microsoft\TestWindow;%PATH%
@set PATH=%VsDir%\Common7\Tools;%PATH%
@set PATH=%VsDir%\Team Tools\Performance Tools\x64;%PATH%
@set PATH=%VsDir%\Team Tools\Performance Tools;%PATH%
@set PATH=%SdkDir%\F#\4.0\Framework\v4.0;%PATH%
@set PATH=%SdkDir%\Windows\v10.0A\bin\NETFX 4.6 Tools\x64;%PATH%
@set PATH=%KitDir%\10\bin\x64;%PATH%
@set PATH=%KitDir%\10\bin\x86;%PATH%
@set PATH=%MsBuildDir%\14.0\bin\amd64;%PATH%
@set PATH=%DotNetDir%\Framework64\v4.0.30319;%PATH%
@set PATH=%HtmlDir%;%PATH%

::设置编译器 INCLUDE 环境变量
@set INCLUDE=%VsDir%\VC\INCLUDE;%INCLUDE%
@set INCLUDE=%VsDir%\VC\ATLMFC\INCLUDE;%INCLUDE%
@set INCLUDE=%KitDir%\10\include\10.0.10240.0\um;%INCLUDE%
@set INCLUDE=%KitDir%\10\include\10.0.10240.0\ucrt;%INCLUDE%
@set INCLUDE=%KitDir%\10\include\10.0.10240.0\winrt;%INCLUDE%
@set INCLUDE=%KitDir%\10\include\10.0.10240.0\shared;%INCLUDE%
@set INCLUDE=%KitDir%\NETFXSDK\4.6\include\um;%INCLUDE%

::设置编译器 LIB 环境变量
@set LIB=%VsDir%\VC\LIB\amd64;%LIB%
@set LIB=%VsDir%\VC\ATLMFC\LIB\amd64;%LIB%
@set LIB=%KitDir%\10\lib\10.0.10240.0\um\x64;%LIB%
@set LIB=%KitDir%\10\lib\10.0.10240.0\ucrt\x64;%LIB%
@set LIB=%KitDir%\NETFXSDK\4.6\lib\um\x64;%LIB%

::设置编译器 LIBPATH 环境变量
@set LIBPATH=%VsDir%\VC\LIB\amd64;%LIBPATH%
@set LIBPATH=%VsDir%\VC\ATLMFC\LIB\amd64;%LIBPATH%
@set LIBPATH=%SdkDir%\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs\14.0\References\CommonConfiguration\neutral;%LIBPATH%
@set LIBPATH=%KitDir%\10\References;%LIBPATH%
@set LIBPATH=%KitDir%\10\References\Windows.Foundation.FoundationContract\1.0.0.0;%LIBPATH%
@set LIBPATH=%KitDir%\10\References\Windows.Foundation.UniversalApiContract\1.0.0.0;%LIBPATH%
@set LIBPATH=%KitDir%\10\References\Windows.Networking.Connectivity.WwanContract\1.0.0.0;%LIBPATH%
@set LIBPATH=%KitDir%\10\UnionMetadata;%LIBPATH%
@set LIBPATH=%DotNetDir%\Framework64\v4.0.30319;%LIBPATH%

:: 编译成 x86-64bit 程序
@set Platform=X64
:: 编译类型为原生编译
@set CommandPromptType=Native


:: 删除原有的 build 文件夹及里面的所有文件
@rd /s/q build
:: 建立新的 build 文件夹
@md build
:: 把自己的源文件件复制到 build 文件夹
@xcopy src build /s /e /h
:: 把自己其它需要的工具复制到 build 文件夹
@xcopy tool build /s /e /h

:: 进入 build 文件夹
@cd build
:: 将 .so.dll 文件夹加入到 PATH 环境变量里
@set PATH=..\.so.dll;%PATH%
:: 将 include 文件夹加入到 INCLUDE 环境变量里
@set INCLUDE=..\include;%INCLUDE%
:: 将 .a.lib 文件夹加入到 LIB 环境变量里
@set LIB=..\.a.lib;%LIB%
:: 将 .a.lib 文件夹加入到 LIBPATH 环境变量里
@set LIBPATH=..\.a.lib;%LIBPATH%
:: 把 main.c 编译 成可执行文件 main.exe,编译不同的程序,你需要修改的只有这一句
@cl.exe /EHsc main.c

::设置程序运行 PATH 环境变量
@set PATH=%VsDir%\VC\redist\x64\Microsoft.VC140.CRT;%PATH%
@set PATH=%VsDir%\VC\redist\x64\Microsoft.VC140.CXXAMP;%PATH%
@set PATH=%VsDir%\VC\redist\x64\Microsoft.VC140.MFC;%PATH%
@set PATH=%VsDir%\VC\redist\x64\Microsoft.VC140.MFCLOC;%PATH%
@set PATH=%VsDir%\VC\redist\x64\Microsoft.VC140.OpenMP;%PATH%
:: 运行可执行文件 main.exe,根据程序的不同运行环境可能需要添加其它命令
@main.exe
:: 程序运行结束后等待退出命令行
@pause

编译运行效果如下图所示:

如果只运行编译好的程序,就双击 Visual_Studio_2015_x86-64bit_运行.bat,

Visual_Studio_2015_x86-64bit_运行.bat 文件代码如下:

@echo off

:: 读取 path 文件夹内的文件 Visual_Studio_2015.ini 并将文件内容存入变量 sPath 中
@set /p sPath=<path\Visual_Studio_2015.ini

:: 推断出 Visual Studio 路径
@set VsDir=%sPath%\Microsoft Visual Studio 14.0
:: 推断出 SDK 路径
@set SdkDir=%sPath%\Microsoft SDKs
:: 推断出 Kit 路径
@set KitDir=%sPath%\Windows Kits
:: 推断出 MSBuild 路径
@set MsBuildDir=%sPath%\MSBuild
:: 推断出 .NET 路径
@set DotNetDir=%sPath%\Microsoft.NET
:: 推断出 HHW 路径
@set HtmlDir=%sPath%\HTML Help Workshop

:: 进入 build 文件夹
@cd build
:: 将 .so.dll 文件夹加入到 PATH 环境变量里
@set PATH=..\.so.dll;%PATH%

::设置程序运行 PATH 环境变量
@set PATH=%VsDir%\VC\redist\x64\Microsoft.VC140.CRT;%PATH%
@set PATH=%VsDir%\VC\redist\x64\Microsoft.VC140.CXXAMP;%PATH%
@set PATH=%VsDir%\VC\redist\x64\Microsoft.VC140.MFC;%PATH%
@set PATH=%VsDir%\VC\redist\x64\Microsoft.VC140.MFCLOC;%PATH%
@set PATH=%VsDir%\VC\redist\x64\Microsoft.VC140.OpenMP;%PATH%

:: 运行可执行文件 main.exe,根据程序的不同运行环境可能需要添加其它命令
@main.exe
:: 程序运行结束后等待退出命令行
@pause

这样,我们就可以在多种操作系统和编译器环境下,测试同一个程序,接下来看一下我的 Visual_Studio_2015 绿色版路径下的内容:

假如你现在安装了 Visual_Studio 这些文件夹就在你的电脑里,Microsoft.NET 在 C:\Windows 下,其它的文件夹在 64 位系统的 C:\Program Files (x86),或 32 位系统的 C:\Program Files 下,你只要新建一个文件夹比如 E:\VS2015,并把这些文件夹拷贝进去就可以用了,但如果你存放的路径不是 E:\VS2015,那就要改一下刚才编译程序文件夹 path 路径下 Visual_Studio_2015.ini 文件了,mingw-GCC 路径跟我不一致,也要改一下 mingw_x86-32bit.ini,而且你也可以自己弄一个 64 位版 mingw-GCC 的编译环境。

 

重装系统后编译器依然有效,省去了安装软件的时间,不过不能用 Visual_Studio 代码编辑器了,需要用其它代码编辑器写程序,我习惯用 gedit,Ubuntu 系统自带,Windows 可以下载安装。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值