学习在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

时间: 2024-10-30 22:09:07

学习在dos下使用gcc来编译的相关文章

Windows Sublime Text 配置Linux子系统(WSL)下的 gcc/g++ 编译环境

0. 简介(若已了解背景可以跳过此部分) Windows 10 Build 14316以上版本中加入了"Windows系统的Linux子系统"(Windows Subsystem for Linux,以下简称WSL)功能,这是一个完整的Linux系统.Sublime Text是一个迅速并且功能强大代码编辑器.现在网上大多数关于Sublime Text配置gcc/g++编译环境的教程都是用MinGW之类的工具,这里来讲讲如何使用WSL来创建原汁原味的gcc/g++编译环境. 1. 安装W

linux下使用gcc/g++编译代码时gets函数有错误

今天在linux中使用个g++编译一个名为myfirst.cpp的代码的时候,出现如下错误 myfirst.cpp: In function ‘int main()’:myfirst.cpp:11:2: warning: ‘char* gets(char*)’ is deprecated (declared at /usr/include/stdio.h:638) [-Wdeprecated-declarations] gets(cc); ^myfirst.cpp:11:9: warning:

dos下带包名如何运行java文件

1.当类没有包时dos下 javac Test.java //编译Test类,生产class文件 java Test //运行Test类 javac HelloWorld.javajava HelloWorld 2.当有包名情况下 com.application.Test javac -d . Test.java //可以生存到包的class文件,也就是像开发工具中生存的文件夹 java com.application.Test //运行这个类 study.HelloWorldjavac -d

我的Java开发学习之旅------&gt;在Dos环境下Java内部类的编译和运行

习惯了在IDE工具上进行代码编写,连最基本的Javac命令和Java命令都忘记的差不多了,今天对一个Java内部类进行编译和运行的时候,就出糗了.IDE是把双刃剑,它可以什么都帮你做了,你只要敲几行代码,点几下鼠标,程序就跑起来了,用起来相当方便.你不用去关心它后面做了些什么,执行了哪些命令,基于什么原理.然而也是这种过分的依赖往往让人散失了最基本的技能,当到了一个没有IDE的地方,你便觉得无从下手,给你个代码都不知道怎么去跑. 首先我在C盘上编写了一个InnerClassTest.java代码

学习C语言第一天:在windows下使用gcc的条件

在windows下使用gcc的条件1,必须是提前安装了gcc这个程序 2,在windows系统path的环境变量中,代表windows从哪里寻找程序和相关的库,path中不同的路径用";"分割 在PATH中添加:C:\Qt\Qt5.3.0\Tools\mingw482_32\bin\C:\Qt\Qt5.3.0\5.3\mingw482_32\bin 3,打开命令窗口,输入gcc -v,如果看到gcc版本提示代表gcc配置成功4,打开qt生成一个空的项目,编译后,如果在我的电脑中双击生成

关于在linux下用gcc编译头文件的问题。

关于在linux下用gcc编译头文件的问题. 2011-01-21 18:5215052135380 | 分类:其他编程语言 | 浏览8139次 有node.h prepare.h list.h file.h 这四个头文件, prepare.h中用到了node.h, list.h中用到了preapre.h , file.h中用到了list.h ,怎么用gcc对这四个头文件进行编译. 分享到: 2011-01-22 02:23 天天爱答题,抽奖送惊喜~ 提问者采纳 我用一个例子来告诉你怎么样在 C

【Linux学习】Ubuntu下内核编译(一)

(1)当要执行内核配置时,输入make menuconfig时出现错误 遇到这个问题,主要是以为没有ncurses库,而make menconfig 需要这个库,因此需要安装ncurses或者ncurses-devel即可.输入命令:sudo  apt-get  install ncurses或者sudo apt-get  install ncurses-devel. (2)错误 drivers/input/touchscreen/eeti_ts.c: In function 'eeti_ts_

Linux下的GCC编译指令

1简介 GCC 的意思也只是 GNU C Compiler 而已.经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言:它现在还支持 Ada 语言.C++ 语言.Java 语言.Objective C 语言.Pascal 语言.COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言,等等.而 GCC 也不再单只是 GNU C 语言编译器的意思了,而是变成了 GNU Compiler Collection 也即是 GNU 编译器家族的意思了.另一方面,说到 GCC 对于操作系统平

linux下利用gcc编译C和C++

gcc ------->默认编译c文件(gcc  xxx  -lstdc++链接到c++库编译c++,g++默认编译c++) 一.CC编译程序过程分四个阶段◆ 预处理(Pre-Processing)◆ 编译(Compiling)◆ 汇编(Assembling)◆ 链接(Linking) 1.1 预处理(Pre-Processing) gcc -E test.c -o test.i 或 gcc -E test.c 可以输出test.i文件中存放着test.c经预处理之后的代码.打开test.i文件