入门知识

编译器把编译生成目标代码的任务分为以下4步:
a.预处理,把预处理命令扫描处理完毕;
b.编译,把预处理后的结果编译成汇编或者目标模块;
c.汇编,把编译出来的结果汇编成具体CPU上的目标代码模块;
d.连接,把多个目标代码模块连接生成一个大的目标模块;

gcc 下常用参数

-I 指定头文件搜索路径,默认情况下gcc的搜索路径/usr/include /usr/local/include
-L 指定库文件的搜索路径,默认的搜索路径为 /lib/ /usr/lib /usr/local/lib ??
-l 指定需要链接的库名称, 注:正常的库libboost_regex.so 使用-lboost_regex 省略前面的lib和后面的扩展名
-c 只生成目标代码 注:生成库文件时使用,只编译不链接
-shared 生成动态库
-o 指定输出文件名称
-W 显示所有的警告信息 注:建议打开
-w 屏蔽所有的警告信息,默认情况
-g 把调试开关打开,让编译的目标文件有调试信息
-S 把源文件编译成汇编代码,不做汇编和连接的动作
-E 只把源文件进行预处理之后的结果输出来。不做编译,汇编,连接的动作

-Xlinker -rpath=./lib 指定程序运行是动态库的搜索路径

-MM 显示出目标文件所依赖的源文件和头文件,头文件仅包括本地头文件

-M    与-MM类似,但是头文件包括系统头文件,即用”<>”

这两个参数在写makefile时用到

实用方法

1, 生成动态库方法
$ gcc -fPIC -c func.c -o func.o
$ gcc -shared -o libfunc.so.1.0.0 func.o
2, 生成静态库方法
$ gcc -c func.c -o func.o
$ ar rcs libfunc.a func.o
3, ldd 命令
查看动态库和可执行文件的依赖的库

4. -MM参数

[yaronli@sim124 cc]$ gcc -MM transfer/Transfer_server.cpp -I. 
Transfer_server.o: transfer/Transfer_server.cpp transfer/Transfer.h \
  transfer/transfer_types.h transfer/TransferStatus.h \
  transfer/TransferTasks.h common/TaskIf.h transfer/TransferWorker.h \
  common/RingBuffer.h common/TaskIf.h common/FileHandler.h common/log.h \
  common/DbOperator.h transfer/Transfer_server.h

问题总结

1, 静态编译时,被依赖库放到依赖库的后面,否则链接时会出错
2, 在生成动态库…………………

来自yaronspace.cn  本文链接:http://yaronspace.cn/blog/archives/837