Cygwin的使用方法

由于自己的项目需要使用Linux内核,所以自己在windows下安装了一个Linux虚拟机!自己实在忍受不了这种速度,随想用cygwin进行替代,毕竟我只是使用Linux内核的部分命令就好。今天下午进行了实验,效果不错,从网上找到了这篇文章,做为cygwin的入门文章!写的不错,enjoy it!

0:简介
1:下载和安装
2:使用

简介
Cygwin是一个运行于Windows下的免费的UNIX的子系统,使用一个Dll(动态链接库)来

实现,这样,我们可以开发出Cygwin下的UNIX工具,使用这个DLL运行在Windows下,大家可以想

一下,你在运行Windows的同时,也可以使用VI,BASH,TAR,SED等UNIX下的工具,不是很好吗?这个VM

虚拟机有很相同的原理,但是VM是虚拟多个,而Cygwin是同时使用Windows和UNIX,很爽吧,这样

对于那些在Windows和Unix下移植的程序来说是比较简单的事情了.

一:下载和安装

其下载安装程序在Http://www.cygwin.com,下载安装程序以后,运行,然后会要你选择是通过什么方

式进行下载安装所需要的文件,有三种方式,Http.Ftp.本地,我建议你首先通过Http和Ftp把安装所需要的

文件全部下回来以后选择本地安装比较好,在线安装比较慢,会是一个很长的等待,虽然所需要的文件

不大,但是全部安装的话会是4G大小,还是有选择性的安装吧,在安装界面,有Prev(老版本),Curr(当前版本)
Exp(最新版本测试版本),苹果这里建议你选择Curr,然后你单击View按钮,这样你可以在可以使用的安装

文件之间进行选择性的安装,如果你真的想全部安装的话,那么左键点击一下最上面的All,然后看到

INSTALL,这样选择了全部,进行全部安装便可以了,安装完以后,会在桌面产生一个图标,双击这个图标,

呵呵,你便可以使用Cygwin了.关于安装的具体参数方法,网络上有比较详细的介绍,我就不罗嗦了.

PS:下载方面我建议如下:你可以下载以下几个版本的Cygwin:

原始站: http://sources.redhat.com/cygwin/
印地安那大学的免安裝光盘cygwin, 叫做 XLiveCD:http://xlivecd.indiana.edu/ , 
USA, Indiana 
ftp://ftp.ussg.indiana.edu/pub/xlivecd/xlivecd-20041201.iso 
Mirrors: 
Belgium, Geel 
ftp://sin.khk.be/mirror/xlivecd/xlivecd-20041201.iso 
Germany, Bochum 
ftp://linux.rz.ruhr-uni-bochum.de/xlivecd/xlivecd-20041201.iso 
Germany, Bochum 
http://linux.rz.ruhr-uni-bochum.de/download/xlivecd/xlivecd-20041201.iso 
Sweden, Ume? 
http://ftp.acc.umu.se/mirror/xlivecd/xlivecd-20041201.iso 
USA, Wisconsin 
ftp://xlivecd.mirrors.tds.net/pub/xlivecd/xlivecd-20041201.iso 
USA, Georgia 
ftp://ftp.gtlib.cc.gatech.edu/pub/XLiveCD/xlivecd-20041201.iso 
USA, Georgia 
http://ftp.gtlib.cc.gatech.edu/pub/XLiveCD/xlivecd-20041201.iso 
苹果提示:USA, Wisconsin 
ftp://xlivecd.mirrors.tds.net/pub/xlivecd/xlivecd-20041201.iso
这个下载速度快 
Shelley Yen 的cygnuwin : 
ftp://ftp.tceb.edu.tw/pub/free_software/cygnuwin/ 
ftp://ftp.tcc.edu.tw/iso/cygwin/cyg+gnu.iso(cygwin 与 gnuwin 的合成版本)
老古开发网:ftp://ic.laogu.com/down/cygwin.rar
http://soft.laogu.com/down/cygwin.rar (均为05年3月版本)

苹果提示:这个站点是高人站点,比较NB,呵呵,喜欢单片机的朋友有福气,超级多 的下载资料等着你,包含*NIX下的东西...

其他的镜像站点:http://cygwin.com/mirrors.html

苹果自己也下载了最新版本的Cygwin,但是偶没有空间,真的需要的话,请哪位好心人提供空间

偶可以上传上去,联系请加偶的QQ:4791821,或者给偶发邮件:Taynni@gmail.com注明一下就可以了.

二:使用

使用上的方便性很是不错,启动Cygwin以后,会在Windows下得到一个Bash Shell,由于Cygwin是以

Windows下的服务运行的,所以很多情况下和在Linux下有很大的不同,这点上,苹果建议你多理解下这个

工作环境。我们开始使用Cygwin吧,比如PS,相当于Windows下的TM(任务管理器),呵呵,直接Ps的话

那么得到的会是Cygwin下的Shell的进程如下
Taynni-417@ENTERBD-417 ~
$ ps
PID PPID PGID WINPID TTY UID STIME COMMAND
2212 1 2212 2212 con 1003 01:54:29 /usr/bin/bas
3384 2212 3384 3232 con 1003 01:59:24 /usr/bin/ps

如果这个时候你需要在Cygwin下显示Windows下的进程你可以在PS后面加上参数-aW,

PS的相关用法:

Quote 
Usage ps [-aefl] [-u uid]
-f = show process uids, ppids
-l = show process uids, ppids, pgids, winpids
-u uid = list processes owned by uid
-a, -e = show processes of all users
-s = show process summary
-W = show windows as well as cygwin processes
很容易看懂吧,呵呵

有点不一样的地方,我想大家一定想知道在Cygwin下怎么访问Windows下的内容了,

呵呵,首先使用DF命令直接查看下本地驱动器,呵呵,很容易了吧,显示的内容

如下:

Quote 
Taynni-417@ENTERBD-417 ~
$ df
Filesystem 1k-blocks Used Available Use% Mounted on
e:\cygwin\bin 10231384 4844432 5386952 48% /usr/bin
e:\cygwin\lib 10231384 4844432 5386952 48% /usr/lib
e:\cygwin 10231384 4844432 5386952 48% /
c: 5106676 1240312 3866364 25% /cygdrive/c
d: 10239408 6560328 3679080 65% /cygdrive/d
e: 10231384 4844432 5386952 48% /cygdrive/e
f: 6333252 4065564 2267688 65% /cygdrive/f
g: 7150972 4672724 2478248 66% /cygdrive/g
如上便是我的硬盘的全部了,在后面的/cygdrive/c便是C盘了,然后/cygdrive/d便是D盘了

这样的话,想进D盘便可以这样进,呵呵

Quote 
Taynni-417@ENTERBD-417 ~
$ cd /cygdrive/d

Taynni-417@ENTERBD-417 /cygdrive/d
$ ls -l
ls: pagefile.sys: Permission denied
total 0
drwxr-xr-x 9 Taynni-4 None 0 Aug 31 20:56 Book
drwxr-xr-x 2 Taynni-4 None 0 Aug 23 05:24 Ftproot
drwxr-xr-x 30 Taynni-4 None 0 May 10 23:38 HACKER
drwxr-xr-x 11 Taynni-4 None 0 Feb 1 2005 JIAOXUE
drwxr-xr-x 8 Taynni-4 None 0 Jan 3 2005 Local Settings
dr-xr-xr-x 24 Taynni-4 None 0 Oct 16 2004 My Documents
drwxr-xr-x 12 Taynni-4 None 0 May 14 16:48 Mywww
drwxr-xr-x 2 Taynni-4 None 0 Jun 29 2004 Recycled
drwxr-xr-x 3 Taynni-4 None 0 Aug 22 04:44 SECBOOK
drwxr-xr-x 6 Taynni-4 None 0 Feb 28 2005 TaynniCHX
drwxr-xr-x 15 Taynni-4 None 0 Mar 30 01:04 TaynniGZ
drwxr-xr-x 12 Taynni-4 None 0 May 11 01:30 TaynniH
drwxr-xr-x 15 Taynni-4 None 0 Mar 12 04:27 TaynniYM
drwxr-xr-x 6 Taynni-4 None 0 Dec 13 2004 Taynniwww
drwxr-xr-x 8 Taynni-4 None 0 Aug 31 20:55 Word

Taynni-417@ENTERBD-417 /cygdrive/d
$

在Cygwin下还可以运行Windows下的程序,如下:
Taynni-417@ENTERBD-417 ~
$ cmd.exe
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

e:\cygwin\home\Taynni-417>d:

D:\>cd hacker

D:\HACKER>cd tools

D:\HACKER\Tools>cd pstools

D:\HACKER\Tools\Pstools>ls
pdh.dll pskill.exe pspasswd.exe
Psinfo.exe psexec.exe pslist.exe psservice.exe
Pstools.chm psfile.exe psloggedon.exe psshutdown.exe
README.TXT psgetsid.exe psloglist.exe pssuspend.exe

D:\HACKER\Tools\Pstools>exit

Taynni-417@ENTERBD-417 ~
$
很明显的,直接输入CMD.EXE便可以得到一个本机CMDSHELL,这样你想运行什么程序都可以了

退出到Cygwin的Bash shell需要使用exit命令,很方便吧,呵呵

在Cygwin下还可以进行编译程序,比如C和perl,当然,你也可以借助ActivePy,这个东西也很不错

也是一个仿真器,在Windows下模拟perl的解释器.

对于一个系统而言,没有相应的系统工具是不可能的,在Cygwin下拥有的UNIX工具基本上够你使用

了。当然,这需要你安装完整的Cygwin包,我的机子上就安装了完整的,比较大,如果硬盘允许,苹果建

议你完整安装!像grep,cut,sed,strings,strace,md5sum,diff,patch,ssh,xxd,等等工具

你都可以进行安装和使用,如果你真的不知道应该怎么用这些工具,其实苹果很多也不会,只要去接触

你就会了!!!没有不会使用的东西,只有你愿意不愿意去使用而已!说笑了,言归正传,请使用

所要使用的命令 --help获取帮助,如下所示:比如我不知道md5sum做什么用的

(这个命令是用于效验文件md5值的,主要是为了文件的完整性和安全性)

Quote 
Taynni-417@ENTERBD-417 ~
$ md5sum --help
Usage: md5sum [OPTION] [FILE]...
or: md5sum [OPTION] --check [FILE]
Print or check MD5 (128-bit) checksums.
With no FILE, or when FILE is -, read standard input.

-b, --binary read files in binary mode (default on DOS/Windows)
-c, --check check MD5 sums against given list
-t, --text read files in text mode (default)

The following two options are useful only when verifying checksums:
--status don't output anything, status code shows success
-w, --warn warn about improperly formated checksum lines

--help display this help and exit
--version output version information and exit

The sums are computed as described in RFC 1321. When checking, the input
should be a former output of this program. The default mode is to print
a line with checksum, a character indicating type (`*' for binary, ` ' for
text), and name for each FILE.

Taynni-417@ENTERBD-417 ~
$
基本使用上应该没有多大的问题了,文章因为我偷懒,也是不知道该怎么写才可以帮助大家

我很苦恼的是,并没有人给我意见,所以先写这么点吧,如果你有问题的话,请加我的qq或者

给我邮件,大家可以讨论,不是么?

下面给出一些关于Cygwin的资料:
1:http://www.isi.edu/nsnam/ns/ns-cygwin.html
2:http://pigtail.net/LRP/printsrv/cygwin-sshd.html
3:http://kde-cygwin.sourceforge.net/
4:http://x.cygwin.com/
5:http://chinyi.ncit.edu.tw/~peterju/cygwin.html
6:http://cygnome.sourceforge.net/
http://xlivecd.indiana.edu/ 
===============================================================================
 
cygwin的安装,vi的使用,gcc,g++的使用
从windows到linux -- 编程篇 -- cygwin,在win中开发linux程序

    很多用windows的朋友不习惯于用linux的开发环境。虽然很乐意尝试一下,但是往往怕linux系统打乱了自己的正常生活:1〉装linux系统 把windows系统给搞坏了,导致自己无法正常生活;2>linux开发上手太难,写出第一个helloworld不亚于java的难度,环境配 置摸不着头脑。对于此,我的看法是:路不管平还是陡,终归你要走的,如果你愿意投入到linux开发的社群中来,不会安装linux系统,不会配置工作环 境是不能想象的。(事实上,确实要了解很多东西的原理,不然很难排错:诸如,硬盘引导器的引导原理、分区结构原理及linux分区结构和文件系统、环境变 量的设置、种类繁多的压缩包安装包的解压安装方法、用户管理权限管理等常用命令、以至于驱动安装系统中文化等等异常琐碎的东东)。
本文试图跳过这个难走的步骤,启用一个win环境下的linux仿真器(和linux下面的命令行开发环境基本一致),用短短的20分钟的时间,教 你做出 一个纯正的linux下gcc编译的helloworld。就象是买点心前先尝尝味道,不也是一件很愉快的事情么?(注:cygwin事实上不仅有此模拟 功能,它也是移植unix<-->win程序的一个很有效的工具,也有人用它来做嵌入式系统开发)
一、cygwin是什么?
   这个问题你最好google一下"cygwin的历史",或许能够获得更为详尽的答案。简而言之,cygwin是一个在windows平台上运行的 linux模拟环境,是cygnus solutions公司开发的自由软件(该公司开发了很多好东西,著名的还有eCos,不过现已被Redhat收购)。插一句废话,很多朋友不明白 linux和unix的区别和联系,在此也简要介绍一下。UNIX是一个注册商标,是要满足一大堆条件并且支付可观费用才能够被授权使用的一个操作系统; linux是unix的克隆版本,是由其创始人Linus和诸多世界知名的黑客手工打造的一个操作系统。为什么linux和unix之间有很多软件可以很 轻松的移植?因为linux也满足POSIX规范,所以在运行机制上跟unix相近。  
   以下引用网上的一段话
二、 用 于说明cygwin的工作机制:cygnus当初首先把gcc,gdb,gas等开发工具进行了改进,使他们能够生成并解释win32的目标文件。然 后,他们要把这些工具移植到windows平台上去。一种方案是基于win32 api对这些工具的源代码进行大幅修改,这样做显然需要大量工作。因此,他们采取了一种不同的方法——他们写了一个共享库(就是cygwin dll),把win32 api中没有的unix风格的调用(如fork,spawn,signals,select,sockets等)封装在里面,也就是说,他们基于 win32 api写了一个unix系统库的模拟层。这样,只要把这些工具的源代码和这个共享库连接到一起,就可以使用unix主机上的交叉编译器来生成可以在 windows平台上运行的工具集。以这些移植到windows平台上的开发工具为基础,cygnus又逐步把其他的工具(几乎不需要对源代码进行修改, 只需要修改他们的配置脚本)软件移植到windows上来。这样,在windows平台上运行bash和开发工具、用户工具,感觉好像在unix上工作。 关于cygwin实现的更详细描述,请参考
http://cygwin.com/cygwin-ug-net/highlights.html
二、cygwin的安装。
cygwin的安装文件很容易通过google找到。目前国内的网站上有"网络安装版"和"本地安装版"两种。标准的发行版应该是 网络安装版。两者并无大不同,下面介绍一下安装的过程。
step1. 下载后,点击安装文件(setup.exe)进行安装,第一个画面是GNU版权说明,点"下一步(N)—>",
进入安装模式选择画面。
step2. 安装模式有"Install from Internet"、"Download form Internet"、
"Install from Local Directory" 三种。"Install form Internet"就是直接从internet上装,适用于网速较快的情况。如果你和我一样网速不是很快,或者说装过之后想把下载的安装文件保存起来,下 次不再下载了直接安装,就应该选择"Download form Internet",下载安装的文件(大约40M左右)。
事实上,所谓的"本地安装版",也是别人从网上下载全部文件后打的包(适用于中国国情嘛^_^)

step3. 接下来是选择安装目的路径和安装源文件所在的路径,之后就进入了选择安装包所在的路径。
注意了阿,这里可是重头戏。我第一安装的时候就是没有看清这一步,结果没有把gcc装进去,导致没法编译文件。
   + All Default
      + Admin Default
       ....
      + Devel   Default
      + Editors Default
      ....
如上图所示,你在这个TreeView的某个节点上双击,就可以改变它的状态,如Default、Install、Uninstall、Reinstall四种状态。默认的都是Default状态,很多工具的默认状态都是不安装。
在这里我选择了在All这一行上后面的Default上点Install,全部安装,以免后患。(注意:这里的树形控件和win下面的不同,你试试点在All上点 和 在All这一行后面的Default上点,会有不同的响应)
step4. 点下一步,安装成功。它会自动在你的桌面上建立一个快捷方式。
好了,下面就开始我的linux旅程了。双击cygwin的快捷方式进入系统。
首先介绍几个简单的linux命令。
pwd   显示当前的路径
cd    改变当前路径,无参数时进入对应用户的home目录
ls    列出当前目录下的文件。此命令有N多参数,比如ls -al
ps    列出当前系统进程
kill 杀死某个进程
mkdir 建立目录
rmdir 删除目录
rm    删除文件
mv    文件改名或目录改名
man   联机帮助
less 显示文件的最末几行
由于linux下面的命令大多都有很多参数,可以组合使用。所以,每当你不会或者记不清楚改用那个参数,那个开关的时候,可以用man来查找,比如,我想查找ls怎么使用,可以键入
$ man ls
系统回显信息如下:
LS(1)                          FSF                          LS(1)
NAME
       ls - list directory contents
SYNOPSIS
       ls [OPTION]... [FILE]...
DESCRIPTION
       List information about the FILEs (the current directory by
       default). Sort entries alphabetically if none of -cftuSUX
       nor --sort.
       -a, --all
             do not hide entries starting with .
       -A, --almost-all
             do not list implied . and ..
       -b, --escape
             print octal escapes for nongraphic characters
       --block-size=SIZE
             use SIZE-byte blocks
:
很全是吧,嘿嘿。
好了,多说无意,让我们来写一个hello world程序。
# cd
进入了/home/administrator目录,我当前的登陆帐号是administrator
# mkdir source
建立一个叫做source的子目录
# cd source
进入 /home/administrator/source
# vim hello.c
我们编辑hello.c文件,输入:
#include
int main(void) {
printf( "Hello World!");
}
然后,输入wq命令退到命令行。
输入编译指令:
# gcc hello.c -o hello
编译成功后可以看一下
# ls
看到hello.exe了吧,嘿嘿。
好,让我们运行看看。
# ./hello
效果如何?不错吧? :)
okey,现在玩一个C++的hello world,
# vim world.cpp
输入:
#include
using namespace std;
void main() {
cout << "Hello World!";
}
编译C++程序要用g++
# g++ world.cpp -o world
运行一下哈,
# ./world
如何,效果不错吧?诸位都是高手,走到这步应该编些简单程序都不成问题了吧:p
好了,关于如何编写makefile文件,如何用gdb下次再说了。

Linux开发一路过来 cygwin->make->gcc


1.    Cygwin
详细的介绍参见:
http://zh.wikipedia.org/wiki/Cygwin
从使用角度来看:Cygwin就是一个windows软件,该软件就是在windows上仿真linux操作系统。通过虚拟机安装一个linux操作系统也可以实现上述情景。但是Cygwin更加体现着两种操作系统直接互访的功能:Cygwin目录下的所有文件直接就可以在windows下可见操作;而Cygwin运行起来后也可以linux方式直接访问windows下的其余任何文件。
其实window的控制台也是干这种事的,只不过控制台仿真的是MS-DOS;Cygwin仿真的是Linux。MS-DOS已经退出历史舞台,不再更新,现在只能利用它们曾经有的功能。而利用Cygwin,就打开Linux的大门,引入了linux世界无所不能无穷无尽的功能。
       使用层面上,Cygwin就是Linux。Bash shell就是其终端交互的界面;可能也有GUI的界面,GHOME桌面等,不过没有用过。
?       常用命令
       在Bash shell的命令行交互中可以输入很多命令运行。例如:
命令 说明   命令 说明
touch 新建文件   cmd 切换到windows控制台,可以运行windows程序
rm 删除文件   --help 参数,显示命令帮助
mkdir 新建目录   man 显示命令帮助
rmdir 删除目录   info 显示命令更详细帮助
ls 显示文件和目录   ps 显示进程
cd 改当前目录 cd /   echo 输出变量值,echo $PATH
cp 复制文件   find 查找文件
mv 移动文件   diff 比较文件差异
查看命令帮助文档时,按 Ctrl+Z 或 Ctrl+C 退出命令
       更多命令参考:
http://linux.chinaitlab.com/special/linuxcom/Index.html

?       命令位置
这些命令之所以可用,是因为对应的exe都放在 /bin目录下。如果追加扩展的exe放于此目录,也是可以运行的。
此外,bash也可以看作一个脚本语言,其比批处理更灵活,内部通过正则表达式可以最大发挥文本的功能;流程控制也具备了顺序编程语言的特点;熟悉其变量、方法和脚本文件的组织和使用,可以做很多日常的操作维护。
2.    make + makefile
make和makefile就相当于java中的ant 和build.xml。如果说批处理文件是window系统来解析执行;那么makefile就相当于批处理文件,make命令就相当于windows操作系统专门负责解析执行了。
可能更多的是程序员在软件编译执行分发部署中应用make,让人以为make属于专业人士的瑞士军刀,普通人都敬而远之。其实make确实是一个通用的功能。

?       make
总体上说来,make的运行方式和ant极其相似:
具体参见
http://www.gbunix.com/htmldata/2005_01/1/3/article_1145_1.html
              运行格式如下:    make [-f 配置文件] [当前命令]
 
其中:   
如果不指定配置文件,要求当前目录下存在 “makefile”或“Makefile”文件。
              如果不指定当前命令,那么缺省执行第一个命令。
?       makefile
而makefile文件的格式主要分为:
              [宏定义段] + [命令段]
      
宏包括:
                     宏的定义:    CC0=gcc
                     宏的使用:    CC0= $(CC)
      
命令包括:
                     命令名:       [依赖命令]    
                                          [命令行]
                                          [命令行]
      
特别说明:
         如果一个命令段包括多行,行尾用TAB分隔,最后一行后不能有空格。
         注释通过 # 实现
         依赖顺序会自动执行
 
3.    gcc 与make
使用make更多的人是程序员,他们主要用来程序的编译连接分发,在很久以前一直以来使用的更多的是C或C++语言。最终用来辅助程序开发的真正命令其实是gcc;make只是物流处理中心而已。
?       功能
gcc又是如何处理程序的呢?这又涉及到传统的c或C++编译型语言的特点,以及整个处理流程。
相关可以参考:
       
http://docs.huihoo.com/gnu/gcc/gcc.htm
       http://os.51cto.com/art/200806/75991.htm
http://www.cublog.cn/u/13991/showart.php?id=96714
 
一般的编译处理流程:
流程 文件举例 过程 命令行 说明 可选项 阶段
A源代码 hello.c       源代码
B编译预处理的源代码 hello.i     主要是宏展开优化 中间过程
C编译后的目标文件 hello.o 编译 -c -I.:当前目录查找h 
D最终可执行文件
动态库
静态库 hello.exe
hello.so
hello.a 连接  
-shared
ar cqs libso.a so.o -L.:当前目录查找dll
-la:需要查找liba.so
-I.:当前目录查找h 结果
 
一般说来,gcc可以将任何前一阶段的文件生成任何后一段的文件。但是我们可以知需要关心最初的源代码A、中间的C以及最后的结果D。这样方便记忆:
如果将源代码编译,用 –c 选项;否则任何阶段就是直接生成最终的结果文件。
不过,可能存在源代码还存在依赖动态库静态库情况,这就需要在连接阶段考虑如何引进相关dll。
一个例子如下,参照:
http://robbin.javaeye.com/blog/261176
gcc -o main -O2 -L. -lhello main.c 
         -L 指定到哪个附加路径下面去寻找共享库,现在指定在当前目录下面寻找;
         -l 指定链接到哪个共享库上面,我们传的参数hello,那么gcc就会自动链接到libhello.so这个共享库上面 - 命名规则;
         -I 指定到哪个附加路径下面去寻找h文件,当前没有用到,建议在头文件中指明。
例子
以下是一个完整的makefile例子,可以根据实际情况修改
#方便在不同gcc编译器间切换,修改CC即可
CC0=gcc
CC1=arm-apple-darwin-gcc
CC=$(CC0)
#方便在不同gcc编译器间切换,修改LDFLAGS即可
LDFLAGS0=-lobjc
LDFLAGS1=
LDFLAGS=$(LDFLAGS0)
LD=$(CC)
 
#缺省生成最终结果
# -lso 表示要依赖 libso.so 或者libso.a
# -L.  表示在当前目录中查找动态库
all:          testso
testso:      testso.o
                  $(LD) $(LDFLAGS) -o testso.exe $^ -lso -L.
 
#编译:*.m->*.o
%.o:          %.m
                  $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
 
#清除临时
clean:         
                  rm -f *.o *.exe     *.so *.a
 
#连接:静态库
a:               
                  ar cqs libso.a so.o
 
#连接:动态库
so:
                  $(CC) so.m -shared -o libso.so -fPIC     
?       辅助命令
这里用到几个与程序相关的命令:
nm:        专门针对exe或者so;可以查看程序的分段情况以及函数调用情况
strings:    针对任何文件;查看使用了哪些函数
strip:      去除符号表,可以减轻exe或so大小,但是不再支持调试信息输出
Iphone darwin gcc
利用iphone破解版的gcc时,发现和缺省的gcc存在一点小区别:
         最后的可执行文件名: 如果指定hello,gcc会自动生成为hello.exe;但是iphone却不带后缀。建议在makefile全部加上后缀
         不再支持“-Wl,-soname”
.    C的程序结构组织
可以参照:
http://www.shanghai.ws/gnu/gcc_1.htm
       各类文件格式
各类文件格式如下,从左到右恰好也是文件的处理过程:
后缀 类型 后缀 类型 后缀 类型 后缀 类型
.c C源程序 .i 预处理后C文件 .o 编译后目标文件 .a 连接后归档文件
.C
.cxx
.cc C++源程序 .ii 预处理后C++文件     .so 连接后动态库结果文件
.m Objective-C源程序         .exe 连接后exe文件
.s 汇编源程序            
.S 汇编源程序            
.h 各种c头文件            
       静态库和动态库的生成
       利用 gcc + make可以实现。
gcc -o main -O2 -L. -lhello main.c

       静态库和动态库的运行时位置查找
参见:
http://blog.chinaunix.net/u/16651/showart.php?id=434959
 
         编译目标代码时指定的动态库搜索路径;
         环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
         配置文件/etc/ld.so.conf中指定的动态库搜索路径;
         默认的动态库搜索路径/lib;
         默认的动态库搜索路径/usr/lib。
但是在cygwin下找不到“/etc/ld.so.conf”,郁闷。

 

gcc的选项(part),cygwin 编译的时候会用到
[转载自 
http://www.linuxfans.org
[介绍] 
gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 
1.预处理,生成.i的文件[预处理器cpp] 
2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs] 
3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as] 
4.连接目标代码,生成可执行程序[链接器ld]

[参数详解] 
-x language filename 
  设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定C语言的后 
缀名称是.c的,而C++的后缀名是.C或者.cpp,如果你很个性,决定你的C代码文件的后缀 
名是.pig 哈哈,那你就要用这个参数,这个参数对他后面的文件名都起作用,除非到了 
下一个参数的使用。 
  可以使用的参数吗有下面的这些 
  `c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `a 
ssembler-with-cpp'. 
  看到英文,应该可以理解的。 
  例子用法: 
  gcc -x c hello.pig 
   
-x none filename 
  关掉上一个选项,也就是让gcc根据文件名后缀,自动识别文件类型 
  例子用法: 
  gcc -x c hello.pig -x none hello2.c 
   
-c 
  只激活预处理,编译,和汇编,也就是他只把程序做成obj文件 
  例子用法: 
  gcc -c hello.c 
  他将生成.o的obj文件 
-S 
  只激活预处理和编译,就是指把文件编译成为汇编代码。 
  例子用法 
  gcc -S hello.c 
  他将生成.s的汇编代码,你可以用文本编辑器察看 
-E 
  只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面. 
  例子用法: 
  gcc -E hello.c > pianoapan.txt 
  gcc -E hello.c | more 
  慢慢看吧,一个hello word 也要与处理成800行的代码 
-o 
  制定目标名称,缺省的时候,gcc 编译出来的文件是a.out,很难听,如果你和我有同感 
,改掉它,哈哈 
  例子用法 
  gcc -o hello.exe hello.c (哦,windows用习惯了) 
  gcc -o hello.asm -S hello.c 
-pipe 
  使用管道代替编译中临时文件,在使用非gnu汇编工具的时候,可能有些问题 
  gcc -pipe -o hello.exe hello.c 
-ansi 
  关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性(包括禁止一些asm inl 
ine typeof关键字,以及UNIX,vax等预处理宏, 
-fno-asm 
  此选项实现ansi选项的功能的一部分,它禁止将asm,inline和typeof用作关键字。 
     
-fno-strict-prototype 
  只对g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式的对参数 
的个数和类型说明,而不是没有参数. 
  而gcc无论是否使用这个参数,都将对没有带参数的函数,认为城没有显式说明的类型 
   
-fthis-is-varialble 
  就是向传统c++看齐,可以使用this当一般变量使用. 
   
-fcond-mismatch 
  允许条件表达式的第二和第三参数类型不匹配,表达式的值将为void类型 
   
-funsigned-char 
-fno-signed-char 
-fsigned-char 
-fno-unsigned-char 
  这四个参数是对char类型进行设置,决定将char类型设置成unsigned char(前两个参 
数)或者 signed char(后两个参数) 
   
-include file 
  包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以用它设 
定,功能就相当于在代码中使用#i nclude 
  例子用法: 
  gcc hello.c -include /root/pianopan.h 
   
-imacros file 
  将file文件的宏,扩展到gcc/g++的输入文件,宏定义本身并不出现在输入文件中 
   
-Dmacro 
  相当于C语言中的#define macro 
   
-Dmacro=defn 
  相当于C语言中的#define macro=defn 
   
-Umacro 
  相当于C语言中的#undef macro 
-undef 
  取消对任何非标准宏的定义 
   
-Idir 
  在你是用#i nclude"file"的时候,gcc/g++会先在当前目录查找你所制定的头文件,如 
果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他 
  回先在你所制定的目录查找,然后再按常规的顺序去找. 
  对于#i nclude,gcc/g++会到-I制定的目录查找,查找不到,然后将到系统的缺 
省的头文件目录查找 
   
-I- 
  就是取消前一个参数的功能,所以一般在-Idir之后使用 
   
-idirafter dir 
  在-I的目录里面查找失败,讲到这个目录里面查找. 
   
-iprefix prefix 
-iwithprefix dir 
  一般一起使用,当-I的目录查找失败,会到prefix+dir下查找 
   
-nostdinc 
  使编译器不再系统缺省的头文件目录里面找头文件,一般和-I联合使用,明确限定头 
文件的位置 
   
-nostdin C++ 
  规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创libg++库 
使用 
   
-C 
  在预处理的时候,不删除注释信息,一般和-E使用,有时候分析程序,用这个很方便的 
   
-M 
  生成文件关联的信息。包含目标文件所依赖的所有源代码你可以用gcc -M hello.c 
来测试一下,很简单。 
   
-MM 
  和上面的那个一样,但是它将忽略由#i nclude造成的依赖关系。 
   
-MD 
  和-M相同,但是输出将导入到.d的文件里面 
   
-MMD 
  和-MM相同,但是输出将导入到.d的文件里面 
   
-Wa,option 
  此选项传递option给汇编程序;如果option中间有逗号,就将option分成多个选项,然 
后传递给会汇编程序 
   
-Wl.option 
  此选项传递option给连接程序;如果option中间有逗号,就将option分成多个选项,然 
后传递给会连接程序. 
   
-llibrary 
  制定编译的时候使用的库 
  例子用法 
  gcc -lcurses hello.c 
  使用ncurses库编译程序 
   
-Ldir 
  制定编译的时候,搜索库的路径。比如你自己的库,可以用它制定目录,不然 
  编译器将只在标准库的目录找。这个dir就是目录的名称。 
   
-O0 
-O1 
-O2 
-O3 
  编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高  
     
-g 
  只是编译器,在编译的时候,产生调试信息。 
   
-gstabs 
  此选项以stabs格式声称调试信息,但是不包括gdb调试信息. 
   
-gstabs+ 
  此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息. 
   
-ggdb 
  此选项将尽可能的生成gdb的可以使用的调试信息. 
-static 
  此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么 
动态连接库,就可以运行. 
-share 
  此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库. 
-traditional 
  试图让编译器支持传统的C语言特性 
[参考资料] 
-Linux/UNIX高级编程 
  中科红旗软件技术有限公司编著.清华大学出版社出版 
-Gcc man page 
   
[ChangeLog] 
-2002-08-10 
  ver 0.1 发布最初的文档 
-2002-08-11 
  ver 0.11 修改文档格式 
-2002-08-12 
  ver 0.12 加入了对静态库,动态库的参数 
-2002-08-16 
  ver 0.16 增加了gcc编译的4个阶段的命令 
运行 gcc/egcs 
**********运行 gcc/egcs*********************** 
  GCC 是 GNU 的 C 和 C++ 编译器。实际上,GCC 能够编译三种语言:C、C++ 和 O 
bject C(C 语言的一种面向对象扩展)。利用 gcc 命令可同时编译并连接 C 和 C++ 
源程序。 
  如果你有两个或少数几个 C 源文件,也可以方便地利用 GCC 编译、连接并生成可 
执行文件。例如,假设你有两个源文件 main.c 和 factorial.c 两个源文件,现在要编 
译生成一个计算阶乘的程序。 
代码: 
----------------------- 
清单 factorial.c 
----------------------- 
int factorial (int n) 

  if (n <= 1) 
   return 1; 
  else 
   return factorial (n - 1) * n; 

----------------------- 
清单 main.c 
----------------------- 
#include  
#include  
int factorial (int n); 
int main (int argc, char **argv) 

  int n; 
  if (argc < 2) 
  { 
    printf ("Usage: %s n\n", argv [0]); 
    return -1; 
  } 
  else 
  { 
   n = atoi (argv[1]); 
   printf ("Factorial of %d is %d.\n", n, factorial (n)); 
   } 
  return 0; 

----------------------- 
利用如下的命令可编译生成可执行文件,并执行程序: 
$ gcc -o factorial main.c factorial.c 
$ ./factorial 5 
Factorial of 5 is 120. 
  GCC 可同时用来编译 C 程序和 C++ 程序。一般来说,C 编译器通过源文件的后缀 
名来判断是 C 程序还是 C++ 程序。在 Linux 中,C 源文件的后缀名为 .c,而 C++ 源 
文件的后缀名为 .C 或 .cpp。但是,gcc 命令只能编译 C++ 源文件,而不能自动和 C 
++ 程序使用的库连接。因此,通常使用 g++ 命令来完成 C++ 程序的编译和连接,该程 
序会自动调用 gcc 实现编译。假设我们有一个如下的 C++ 源文件(hello.C): 
#i nclude 
void main (void) 

  cout << "Hello, world!" << endl; 

则可以如下调用 g++ 命令编译、连接并生成可执行文件: 
$ g++ -o hello hello.C 
$ ./hello 
Hello, world! 
**********************gcc/egcs 的主要选项********* 
gcc 命令的常用选项 
选项 解释 
-ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色, 
例如 asm 或 typeof 关键词。 
-c 只编译并生成目标文件。 
-DMACRO 以字符串“1”定义 MACRO 宏。 
-DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。 
-E 只运行 C 预编译器。 
-g 生成调试信息。GNU 调试器可利用该信息。 
-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。 
-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。 
-lLIBRARY 连接时搜索指定的函数库LIBRARY。 
-m486 针对 486 进行代码优化。 
-o FILE 生成指定的输出文件。用在生成可执行文件时。 
-O0 不进行优化处理。 
-O 或 -O1 优化生成代码。 
-O2 进一步优化。 
-O3 比 -O2 更进一步优化,包括 inline 函数。 
-shared 生成共享目标文件。通常用在建立共享库时。 
-static 禁止使用共享连接。 
-UMACRO 取消对 MACRO 宏的定义。 
-w 不生成任何警告信息。 
-Wall 生成所有警告信息。

相关推荐
<p> <b><span style="font-size:14px;"></span><span style="font-size:14px;background-color:#FFE500;">【Java面试宝典】</span></b><br /> <span style="font-size:14px;">1、68讲视频课,500道大厂Java常见面试题+100个Java面试技巧与答题公式+10万字核心知识解析+授课老师1对1面试指导+无限次回放</span><br /> <span style="font-size:14px;">2、这门课程基于胡书敏老师8年Java面试经验,调研近百家互联网公司及面试官的问题打造而成,从筛选简历和面试官角度,给出能帮助候选人能面试成功的面试技巧。</span><br /> <span style="font-size:14px;">3、通过学习这门课程,你能系统掌握Java核心、数据库、Java框架、分布式组件、Java简历准备、面试实战技巧等面试必考知识点。</span><br /> <span style="font-size:14px;">4、知识点+项目经验案例,每一个都能做为面试的作品展现。</span><br /> <span style="font-size:14px;">5、本课程已经在线下的培训课程中经过实际检验,老师每次培训结束后,都能帮助同学们运用面试技巧,成功找到更好的工作。</span><br /> <br /> <span style="font-size:14px;background-color:#FFE500;"><b>【超人气讲师】</b></span><br /> <span style="font-size:14px;">胡书敏 | 10年大厂工作经验,8年Java面试官经验,5年线下Java职业培训经验,5年架构师经验</span><br /> <br /> <span style="font-size:14px;background-color:#FFE500;"><b>【报名须知】</b></span><br /> <span style="font-size:14px;">上课模式是什么?</span><br /> <span style="font-size:14px;">课程采取录播模式,课程永久有效,可无限次观看</span><br /> <span style="font-size:14px;">课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化</span><br /> <br /> <br /> <span style="font-size:14px;background-color:#FFE500;"><strong>如何开始学习?</strong></span><br /> <span style="font-size:14px;">PC端:报名成功后可以直接进入课程学习</span><br /> <span style="font-size:14px;">移动端:<span style="font-family:Helvetica;font-size:14px;background-color:#FFFFFF;">CSDN 学院APP(注意不是CSDN APP哦)</span></span> </p>
<p> <span style="color:#337FE5;"><strong>【为什么还需要学习C++?】</strong></span> </p> <p style="margin-left:0cm;"> 你是否接触很多语言,但从来没有了解过编程语言的本质? </p> <p style="margin-left:0cm;text-align:start;"> 你是否想成为一名资深开发人员,想开发别人做不了的高性能程序? </p> <p style="margin-left:0cm;text-align:start;"> 你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹? </p> <p style="margin-left:0cm;text-align:start;">   </p> <p style="margin-left:0cm;text-align:start;"> 那么C++就是你个人能力提升,职业之路进阶的不二之选。 </p> <p style="margin-left:0cm;text-align:start;"> <br /> </p> <p style="margin-left:0cm;text-align:start;"> <br /> </p> <p style="margin-left:0cm;"> <strong><span style="color:#337FE5;">【课程特色】</span></strong> </p> <p style="margin-left:0cm;text-align:start;"> 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。 </p> <p style="margin-left:0cm;text-align:start;"> 2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。 </p> <p style="margin-left:0cm;text-align:start;"> 3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。 </p> <p style="margin-left:0cm;text-align:start;"> <br /> </p> <p class="ql-long-24357476"> <span style="color:#337FE5;"><strong>【学完后我将达到什么水平?】</strong></span> </p> <p class="ql-long-24357476"> 1.对C++的各个知识能够熟练配置、开发、部署; </p> <p class="ql-long-24357476"> 2.吊打一切关于C++的笔试面试题; </p> <p class="ql-long-24357476"> 3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。 </p> <p class="MsoNoSpacing" style="margin-left:18pt;"> <br /> </p> <div> <br /> </div> <p> <br /> </p> <p style="margin-left:0cm;text-align:start;"> <span style="color:#337FE5;"><strong>【面向人群】</strong></span> </p> <p style="margin-left:0cm;text-align:start;"> <span style="color:#222226;font-family:PingFangSC-Regular, "font-size:14px;background-color:#FFFFFF;">1.希望一站式快速入门的C++初学者;</span> </p> <p style="margin-left:0cm;text-align:start;"> <span style="color:#222226;font-family:PingFangSC-Regular, "font-size:14px;background-color:#FFFFFF;">2.希望快速学习 C++、掌握编程要义、修炼内功的开发者;</span> </p> <p style="margin-left:0cm;text-align:start;"> <span style="color:#222226;font-family:PingFangSC-Regular, "font-size:14px;background-color:#FFFFFF;">3.有志于挑战更高级的开发项目,成为资深开发的工程师。</span> </p> <p style="margin-left:0cm;text-align:start;"> <br /> </p> <p> <br /> </p> <p> <span style="color:#337FE5;"><strong>【课程设计】</strong></span> </p> <p> 本课程包含3大模块 </p> <p> <strong>基础篇</strong><br /> 本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。 </p> <p> <br /> <strong>进阶篇</strong><br /> 本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。 </p> <p> <br /> <strong>提升篇:</strong><br /> 本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。 </p> <p> <img src="https://img-bss.csdnimg.cn/202007091130239667.png" alt="" /> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页