gcc 学习笔记
#gcc(常见)
-v / --v / --version 查看gcc版本号
-I目录 指定头文件的目录,-I和目录之间没有空格
-c 只编译,生成.o文件(二进制文件),不进行连接
-g 调试
-On其中n=0~3 编译优化,n越大优化得越多
-Wall 提示更多的警告信息
-D宏 编译时定义宏,-D宏之间没有空格
在编译时加上-DMYDEBUG,则printf(“”, a)就不会被s编译;
不加-DMYDEBUG就会出现
常用于调试
-E 生成预处理(过滤注释,展开头文件,宏替换)文件,后缀一般为.i
-S 生成汇编文件,后缀名为.s
#
nm 查看目标文件中的符号(全局函数,全局变量等)
objcpy
objdump -dSsx 目标文件(a.out) > 重定向的一个新文件 反汇编
readelf
#静态库和共享库(动态库)
创建静态库步骤(使用命令ar)
(1)先生成.o文件
(2)格式:ar 参数 库名 .o文件(eg: ar rcs libmycalc.a *.o)
要使用这个静态库时,只需在自己定义一个头文件,里面包含着库里的函数
创建共享库(动态库)步骤:
(1)使用-fPIC或-fpic创建目标文件,-fPIC或-fpic表示位置无关代码(跳转指令是使用相对地址(当前地址+偏移量),而不使用绝对地址)
(2)
eg: 基础:(1)gcc -fpic -c a.c
gcc -fpic -c a.c
(2)gcc -shared -Wl -o libmycal.so.1.10 a.o b.o
ldd命令
使用(加载)这个共享库:
- 拷贝自己制作的共享库到/lib或者/usr/lib
- 临时设置LD_LIBRARY_PATH,
“export LD_LIBRARY_PATH =$ LD_LIBRARY_PATH:库路径”
3.永久设置,把“export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH:库路径”设置到~/.bashrc或者/etc/profile中
4. 设置/etc/ld.so.conf,把库所在的路径追加到这个文件里,再刷新一下(刷新命令sudo ldconfig -v)
就业班:(1)gcc -fpic -c a.c
gcc -fpic -c a.c
(2) gcc -shared -Wl,-soname,libmycal.so.1 -o libmycal.so.1.10 *.o
Real name: libmycal.so.1, 要想在目录中显示出来,需要设置/etc/ld.so.conf,把库所在的路径追加到这个文件里,再刷新;
Soname: libmycal.so.1.10
Linkname: libmycal.so(需要手动创建:ln -s soname linkname)