index
编程解题网| 最好用的内网穿透工具合集 | ngrok反向代理下载 | frp反向代理
如何高效的学习Nginx源码 | 如何高效深入的阅读Redis的源码
c-examples | c-libsj | golang for IM
调试命令
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,添加临时路径。