index

cate

编程解题网| 最好用的内网穿透工具合集 | ngrok反向代理下载 | frp反向代理

10 个超赞的 C 语言开源项目

如何高效的学习Nginx源码 | 如何高效深入的阅读Redis的源码

c-examples | c-libsj | golang for IM

GCC编译过程及基本命令总结

调试命令

nm main
file main
strip main
ldd main
export LD_LIBRARY_PATH=/root/clang/ExternC

GCC命令

1. gcc -E source_file.c
   -E,只执行到预编译。直接输出预编译结果。

2. gcc -S source_file.c 
   -S,只执行到源代码到汇编代码的转换,输出汇编代码。

3. gcc -c source_file.c
   -c,只执行到编译,输出目标文件。

4. gcc -g source_file.c 
   -g,生成供调试用的可执行文件,可以在gdb中运行。由于文件中包含了调试信息因此运行效率很低,且文件也大不少。
   这里可以用strip命令重新将文件中debug信息删除。这是会发现生成的文件甚至比正常编译的输出更小了,这是因为strip把原先正常编译中的一些额外信息(如函数名之类)也删除了。用法为 strip a.out

5. gcc -s source_file.c
   -s, 直接生成与运用strip同样效果的可执行文件(删除了所有符号信息)。

6. gcc -O source_file.c
   -O(大写的字母O),编译器对代码进行自动优化编译,输出效率更高的可执行文件。
   -O 后面还可以跟上数字指定优化级别,如:
   
   gcc -O2 source_file.c
   数字越大,越加优化。但是通常情况下,自动的东西都不是太聪明,太大的优化级别可能会使生成的文件产生一系列的bug。一般可选择2;3会有一定风险。
   
   -O0、-O1、-O2、-O3:编译优化选项的四个级别,
   -O0 表示没有优化, -O1 为默认值,-O3 优化级别最高

7. gcc -Wall source_file.c
   -W,在编译中开启一些额外的警告(warning)信息。-Wall,将所有的警告信息全开。

8. gcc source_file.c -L/path/to/lib -lxxx -I/path/to/include
   -l, 指定所使用到的函数库,本例中链接器会尝试链接名为libxxx.a的函数库。
   -L,指定函数库所在的文件夹,本例中链接器会尝试搜索/path/to/lib文件夹。
   -I, 指定头文件所在的文件夹,本例中预编译器会尝试搜索/path/to/include文件夹。


9. 静态编译:
   -static 所有引用到的系统文件都指定成静态库,全部编译到这个可执行文件中

   g++ main.cpp ../person/person.o -o main_static -I ../person -static
   将程序进行静态编译


10.动态编译:
   -fpic -shared  前者指定函数和代码位置不相关,设置之后可以使用-shared将其设置为动态链接库
(动态链接库在linux中的命名规则为 lib+name+.so,引用的时候只要使用name就行了)。

   gcc person.cpp -fpic -shared -o libperson.so
   person.cpp编译成动态链接库 libperson.so。


11.动态链接库路径设置方法有两种:
   (a) 将需要链接的动态链接库文件libperson.so拷贝到系统的path路径下。
   (b) 写执行脚本export LD_LIBRARY_PATH=../person,添加临时路径。