注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

AlexYoung

做好大家都必须要做的事,发展自己感兴趣的事,结束圣人所不齿的事...

 
 
 

日志

 
 

【引用】 cygwin->make->gcc  

2011-03-11 18:55:46|  分类: Linux学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
本文转载自join《 cygwin->make->gcc》

http://iammr.7.blog.163.com/blog/static/491026992009336157466/

1.    Cygwin

详细的介绍参见http://zh.wikipedia.org/wiki/Cygwin

从使用角度来看:Cygwin就是一个windows软件,该软件就是在windows上仿真linux操作系统。通过虚拟机安装一个linux操作系统也可以实现上述情景。但是Cygwin更加体现着两种操作系统直接互访的功能:Cygwin目录下的所有文件直接就可以在windows下可见操作;而Cygwin运行起来后也可以linux方式直接访问windows下的其余任何文件。

其实window的控制台也是干这种事的,只不过控制台仿真的是MS-DOSCygwin仿真的是LinuxMS-DOS已经退出历史舞台,不再更新,现在只能利用它们曾经有的功能。而利用Cygwin,就打开Linux的大门,引入了linux世界无所不能无穷无尽的功能。

       使用层面上,Cygwin就是LinuxBash 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

makemakefile就相当于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)

      

命令包括:

                     命令名:       [依赖命令]    

                                          [命令行]

                                          [命令行]

      

特别说明:

n         如果一个命令段包括多行,行尾用TAB分隔,最后一行后不能有空格。

n         注释通过 # 实现

n         依赖顺序会自动执行

 

3.    gcc make

使用make更多的人是程序员,他们主要用来程序的编译连接分发,在很久以前一直以来使用的更多的是CC++语言。最终用来辅助程序开发的真正命令其实是gccmake只是物流处理中心而已。

?       功能

gcc又是如何处理程序的呢?这又涉及到传统的cC++编译型语言的特点,以及整个处理流程。

相关可以参考:

       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 指定到哪个附加路径下面去寻找共享库,现在指定在当前目录下面寻找;

l         -l 指定链接到哪个共享库上面,我们传的参数hello,那么gcc就会自动链接到libhello.so这个共享库上面 - 命名规则;

l         -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:      去除符号表,可以减轻exeso大小,但是不再支持调试信息输出

?       Iphone darwin gcc

利用iphone破解版的gcc时,发现和缺省的gcc存在一点小区别:

n         最后的可执行文件名: 如果指定hellogcc会自动生成为hello.exe;但是iphone却不带后缀。建议在makefile全部加上后缀

n         不再支持“-Wl,-soname

4.    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

 

l         编译目标代码时指定的动态库搜索路径;

l         环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

l         配置文件/etc/ld.so.conf中指定的动态库搜索路径;

l         默认的动态库搜索路径/lib

l         默认的动态库搜索路径/usr/lib

但是在cygwin下找不到“/etc/ld.so.conf”,郁闷

  评论这张
 
阅读(135)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017