linux编译调试
1.安装
-
$sudo apt install g++ gcc
(一次性安装g++和gcc编译器)
2.过程
-
编辑源码→预处理→编译→汇编→链接→可执行程序
-
使用vim hello.c编辑源码
-
使用file hello.o查看文件类型
-
使用nm hello.o查看二进制文件
2.1预处理
- $gcc -E hello.c -o hello.i
- .i文件,处理以#开头的预编译指令
2.2编译
- $gcc -S hello.c -o hello.s
- .s文件,翻译成汇编代码文件
2.3汇编
- $as hello.s -o hello.o
- .o文件,二进制文件
2.4链接
- $gcc hello.o -o hello
- 可执行文件,绿色的标志
2.5直接编译执行
-
$gcc hello.c -o hello
(使用./hello执行,以c为结尾的文件使用gcc编译)
-
$g++ hello.c
(使用./a.out执行,以cc为结尾的文件使用g++编译)
-
以cpp为结尾的文件gcc和g++都可以进行编译
2.6注释方法
法一
#if 0
此处输入代码
#endif
法二
//此处输入代码
法三
/*此处输入代码*/
3.静态库与动态库
-
$ldd main
(查看main程序的依赖关系)
-
gcc -c add.c -o add.o
(只编译不链接,形成.o文件)
3.1 .a静态库
静态库将会整合到程序中,在程序执行时不用加载静态库。
删除之后不能链接,但可以运行
-
$gcc -c add.c -o add.o
(生成目标代码)
-
$ar crsv libadd.a add.o
(归档打包成库文件)
-
$sudo cp libadd.a /usr/lib
(放入系统库目录下)
-
$gcc main.c -o main -ladd
(链接以add为名的库文件)
-
$./main
(执行)
3.2 .so动态库
动态库只在执行时才被链接使用,不是直接编译为可执行文件,并且一个动态库可以被多个程序使用,故可称为共享库
删除之后不能运行,更新容易,执行程序大小较小
-
$gcc -c add.c -o add.o -fpic
(生成与位置无关的目标代码)
-
$gcc -shared -o libadd.so add.o
(归档打包成共享库文件)
-
$sudo cp libadd.so /usr/lib
(放入系统库目录下)
-
$gcc main.c -o main -ladd
(链接)
-
$./main
(执行)