学习在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
学习在dos下使用gcc来编译的更多相关文章
- Windows Sublime Text 配置Linux子系统(WSL)下的 gcc/g++ 编译环境
0. 简介(若已了解背景可以跳过此部分) Windows 10 Build 14316以上版本中加入了"Windows系统的Linux子系统"(Windows Subsystem ...
- linux下使用gcc/g++编译代码时gets函数有错误
今天在linux中使用个g++编译一个名为myfirst.cpp的代码的时候,出现如下错误 myfirst.cpp: In function ‘int main()’:myfirst.cpp:11:2 ...
- 我的Java开发学习之旅------>在Dos环境下Java内部类的编译和运行
习惯了在IDE工具上进行代码编写,连最基本的Javac命令和Java命令都忘记的差不多了,今天对一个Java内部类进行编译和运行的时候,就出糗了.IDE是把双刃剑,它可以什么都帮你做了,你只要敲几行代 ...
- RedHat 5下安装gcc编译环境的具体步骤
RedHat 5下安装gcc编译环境的具体步骤 在RHEL5系统中默认不安装linux系统中的开发编译环境(gcc),此软件包安装时依赖其他包较多 在以前使用RHEL4时可以通过如下命令安装: rpm ...
- [vim配置]windows下在vim中使用gcc/g++编译调试c/cpp文件
在Linux里面混了一个多月,vim编程用得甚爽.无奈前天将Linux里面的编程文件夹误删,而技术不精无法找回,悲痛欲绝.再者,无限怀念windows里面的游戏,并觉得现在在Linux里面也学不到什么 ...
- dos下编译java
dos下运行java程序,不借助其他的IDE,即可编译运行java程序. 工具/原料 电脑 方法/步骤 打开开始,运行cmd,进入dos界面. 分别运行java,和javac,检测jd ...
- 在Linux下使用gcc编译mesa文件报undefined reference to symbol 'sin@@GLIBC_2.2.5和DSO missing from command line两个错误的解决方案
一.概述 在Linux系统下使用gcc编译用C语言写的mesa的示例程序. 环境:Ubuntu Server 18.04.1 二.问题的出现 在Ubuntu下安装好mesa所需的库文件,将目标文件从g ...
- Ubuntu下使用gcc编译c文件,未识别cos,sin
Ubuntu下使用gcc编译c文件,虽然我调用了math.h的头文件,但是未识别cos,sin 报错:( fft.c ) /tmp/ccwXjD8C.o: In function `fft': fft ...
- windows下使用gcc完成头文件和目标文件编译
环境要求 安装了gcc win+r然后输入cmd , dos界面输入 gcc -v 查看有没有安装gcc 进入正题 新建 text.c文件键入如下代码: #include <stdio.h> ...
随机推荐
- vim相关
保存和传递宏 1 先建立一个宏.如上 2 在任意一个文件的空白位置normal状态下,命令"ap 即可以把宏的内容显示出来.比如说我的宏是: "ohello th id<80 ...
- leetcode438
public class Solution {;public IList<int> FindAnagrams(string s, string p) { List<int> l ...
- __str__ 和 __repr
#1 默认类里面默认提供的__str__方法,是返回类的内存地址class foo: def __init__(self): pass #2 修改类里面默认提供的__str__方法class fun: ...
- The history of programming languages.(transshipment) + Personal understanding and prediction
To finish this week's homework that introduce the history of programming languages , I surf the inte ...
- wiredtiger--初学数据恢复
启动mongodb是failed,日志如下 1.解压wirdtiger包 tar -vxf wiredtiger-3.1.0.tar.bz2 -C /home/wiredtiger/ 2.安装snap ...
- 【Django】数据迁移问题
最近发现,Django在修改models之后重新生成迁移文件(这里可以生成),再进行数据库迁移的时候老是出错,查询数据库时老是找不到表格或者字段. 尝试过重新新建项目,新建一个同名APP,然后mode ...
- matlab--二维画图及三维画图的相关命令
clc;clear all;close all; % plot3是最简单的三维图% mesh是网格图% surf是曲面图%plot3-------------------------t1=0:pi/3 ...
- 725. Split Linked List in Parts把链表分成长度不超过1的若干部分
[抄题]: Given a (singly) linked list with head node root, write a function to split the linked list in ...
- [leetcode]29. Divide Two Integers两整数相除
Given two integers dividend and divisor, divide two integers without using multiplication, divisio ...
- vue 总结
VUE总结 双花括号{{}} 01.index.hmlt main.js 内存的数据可以更改 v-model 双休数据绑定 代码: <!DOCTYPE html> <html lan ...