Unix环境下编译工具链使用注记
来源:互联网 发布:2部电梯 调度算法 编辑:程序博客网 时间:2024/05/29 11:17
本文由枫落夜舞原创,欢迎转载,转载前请注明出处:http://blog.csdn.net/u011152627/article/details/41725269
在Unix环境下,常用的编译环境为gcc/clang。二者的命令格式类似。
编译源码的基本命令:
$ cc [c源码文件] //cc为c语言编译器
$ c++ [c++源码文件] //c++为c++编译器
需要注意的是,不同的开发环境对于cc编译器的定义是不同的,一般情况下,cc指令是一个软链接,指向系统默认的编译器,即使用cc编译器实际调用的是开发环境的默认编译器。
在Linux中,cc的软链接指向gcc编译器。
在FreeBSD中,cc的软链接指向clang编译器。
在Solaris中,cc指令不再是软链接,而是Solaris特有的商业闭源c编译器。
默认情况下,编译器会生成一个名为a.out的二进制可执行文件,运行程序:
$ ./a.out
如果需要指定生成的可执行文件的名称,则需要使用-o参数:
$ cc [源码文件] -o [指定执行文件的名称]
如果不需要直接生成可执行文件,而是只是生成*.o格式的目标文件的话,则需要使用-c参数:
$ cc -c [源码文件]
默认编译器是不会在生成的执行文件中包含调试标记的,如果需要在生成的二进制文件中保留调试标记,需要使用-g参数:
$ cc -g [源码文件]
这样生成的可执行文件就会包含调试标记,可供gdb之类的调试器进行调试:
$ gdb [生成的可执行文件]
需要得到编译器生成的汇编代码可以使用-S参数:
$ cc -S [源码文件]
在Unix环境中,系统的库文件一般存放在/lib,/lib64,/usr/lib等目录下,库文件分为以下两种类型:
1.动态链接库 后缀名为*.so 意为share object(共享对象)
2.静态链接库 后缀名为*.a 意为archive(档案文件)
动态链接库可以由编译器生成:
$ cc -shared -fPIC [源码文件] -o [生成动态库的名字]
静态链接库则使用archive实用工具ar来创建,需要先将源码编译成目标文件,再使用ar命令:
$ ar crv [生成静态库的名字] [目标文件]
在Unix环境中,库的命名方式一般为"lib+[库名]",在编译时如果需要使用链接库,需要-l参数直接加库名而不需要写完整的库文件名字:
$ cc [源码文件] -l[库名]
如果库的位置不在环境变量中,则需要用-L参数手动指定库所在的目录:
$ cc [源码文件] -L[库の目录] -l[库名]
如果源码中引用的头文件位置不在环境变量中,则需要用-I参数手动指定头文件所在的目录:
$ cc [源码文件] -I[头文件の目录]
使用ldd命令可以查看一个可执行文件用到了哪些动态链接库:
$ ldd [可执行文件]
默认情况下,编译器在链接库时优先使用的是动态链接库,如果在某些特别情况下需要使用静态链接库的话,使用-static参数强制编译器使用静态库:
$ cc -static [源码文件] -l[库名]
需要注意的是,如果一个程序使用了自己编写的动态链接库,需要将自己的动态链接库位置加入环境变量中,否则在运行程序时会提示找不到动态链接库。
静态链接库由于在编译阶段已经将库文件包含在可执行文件中,所以不会出现类似问题。
主流的编译器同样支持objective-c(objc)语言,objc语言的源码后缀名为*.m。
要让编译器顺利的编译objc的源码,需要安装objc的对应开发库,在Linux系统中是gnustep库。
使用gcc编译objc源码,需要安装gcc的objc支持包gcc-objc。
编译objc的源码相对编译c/c++源码而言要更复杂,需要使用更多的编译器参数。
使用gnustep-config --objc-flags指令会自动生成编译objc源码需要的编译器参数,并用``符号将指令的结果插入gcc编译指令的参数中。
一般情况下,需要链接libgnustep-base,libobjc这两个库,如果源码使用了GUI库还需要链接libgnustep-gui库。
gcc编译objc源码指令:
$ gcc `gnustep-config --objc-flags` -lobjc -lgnustep-base [源码文件]
由于gnustep-config是与gnu编译器组配套的,故其生成的编译参数并不完全适用于clang编译器,故需要手动指定编译参数以符合clang编译器的要求,根据编译器输出的异常信息将gnustep-config指令生成的参数中不符合要求的参数剔除,并加入其他需要的编译器参数。
clang编译objc源码指令(以Archlinux为例):
$ clang -fconstant-string-class=NSConstantString -lgnustep-base -lobjc -I/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/include [源码文件]
在编译程序时,可以为程序添加代码优化选项来提升程序的运行效率,gcc和clang都有O1,O2,O3三个代码优化级别,O1最低,O3优化最高,使用优化选项能大幅度提升生成二进制文件的执行效率,但会使得生成的程序难以调试。故一般只在程序完成测试之后进入发布阶段才会启用编译优化选项。
0 0
- Unix环境下编译工具链使用注记
- Unix环境下编译动态链接库
- linux下搭建unix编译环境
- 使用Ant工具编译Tomcat源代码(window环境下)
- 在windows下使用Cygwin模拟unix环境,并安装apt-cyg,repo等工具
- 在windows下使用Cygwin模拟unix环境,并安装apt-cyg,repo等工具
- Windows环境下使用Unix bash
- VC2008环境下编译CPPUNIT单元测试工具
- 在windows环境下,使用Eclipse和gcc-Linaro工具链,对BeagleBone进行交叉编译和远程部署
- 在windows环境下,使用Eclipse和gcc-Linaro工具链,对BeagleBone进行交叉编译和远程部署
- ActiveMQ-CPP在UNIX环境下的编译
- 《UNIX环境高级编程》apue源代码Ubuntu下的编译
- 《UNIX环境高级编程》apue源代码Ubuntu下的编译
- 《UNIX环境高级编程》apue源代码Ubuntu下的编译
- UNIX 环境下C++编译运行常见错误
- unix环境高级编程第三版源代码编译及使用
- unix环境高级编程第三版源代码编译及使用
- windows下使用IntelliJ IDEA的erlang编译环境搭建(含rebar工具)
- C#的Event关键字和自定义事件总结
- Ubuntu14.04 LAMP环境搭建
- codeforces 493C Vasya and Basketball(二分)
- MySQL的安全管理
- c++ 中__declspec 的用法
- Unix环境下编译工具链使用注记
- linux下查看主板内存槽与内存信息
- 各种浏览器的USERAGENT格式(useragent)
- 2、Linux下实现按键驱动的几种方式
- UIAlertView弹出视图动画效果
- linux命令指seq
- c# 方法调用链System.Diagnostics.StackTrace
- 【转自《一棵树-博客园》】SQL Server系统表sysobjects介绍与使用
- 老鼠试药