学习在dos下使用gcc来编译
这两年里,断断续续的学习和使用c,平时都是在CodeBlocks里写代码,编译程序,点一下按钮就行了。对整个编译过程是一点儿都不了解。相比当年学习java,真的是选择了两个不同的路,当年学习java的时候,全是在dos下学习,javac, java,javaw之类的命令用的那些相当的熟,几年后才开始使用eclipse写代码。
今天在找如何用CodeBlocks编译生成的exe文件添加版本信息时,发现一篇文章,里面介绍到在dos下使用gcc,我就按照上面的提示操作了一下,过程中没有遇到什么问题。
只是感觉gcc命令用到的参数那是相当的多啊。
1.Console命令行版本:
文件名:main.c
代码:
程序代码:
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
在命令行下面输入:
gcc -Wall -c -g -o main.o main.c 进行文件编译。
参数解释:
-Wall 打开所有的编译警告
-c 只时行编译,不进行链结。
-g 产生调试信息。
-o main.o 生成编译输出文件叫main.o
最后进行文件链结:
ld -Lc:\mingw\lib -o main.exe main.o c:\mingw\lib\crt2.o -lmingw32 -lkernel32 -lmsvcrt
参数解释:
-Lc:\mingw\lib 设置链结时库文件路径,不设置的话,-lmingw32这些参数会找不到的。
-o main.exe 设置输出最终的可执行文件main.exe。
c:\mingw\lib\crt2.o 这个是Windows系统的控制台程序初始化模块。
-lmingw32 -lkernel32 -lmsvcrt 这三个是指示链结时链上libmingw32.a libkernel32.a libmsvcrt.a相关库。其中后两个对应的是kernel32.dll和msvcrt.dll,基本的程序代码printf函数实际上调用的是puts函数,在msvcrt.dll动态库中。
当正式编译的时候,可以使用以下命令行以生成最小的EXE:
gcc -s -O2 main.c -mconsole
参数解释:
-s 编译生成汇编代码
-O2 进行目标代码优化,O1到O3范围
-mconsole 指定生成控制台程序。
虽然这里正式编译的示例没有上面步子那么多,但你依然需要如示例所示,明白一个程序倒底和哪些库/模块进行了链结。然后我们使用depends.exe查看程序与运行库依赖,如下图所示:
2.Windows版本:
文件名:main.c
代码:
程序代码:
#include <windows.h>
typedef HINSTANCE _h;
int WINAPI WinMain(_h hinst, _h hprev, LPSTR cmd, int nShow)
{
return MessageBox(NULL, "hello world!", "OK", MB_OK);
}
命令行输入:
gcc -c main.c
ld -L"C:\Program Files\CodeBlocks\MinGW\lib" main.o "C:\Program Files\CodeBlocks\MinGW\lib\crt2.o" -lmingw32 -lkernel32 -luser32 -lmsvcrt
这里示例的是如果是带空格的路径。
当正式编译的时候,可以使用以下命令行以生成最小的EXE:注意-mwindows表示的是生成windows应用程序
gcc -s -O2 main.c -mwindows
用depends.exe查看程序与运行库依赖。用spy++查看窗口消息和信息。
2012-09-15