安装gcc
sudo apt update
sudo apt install build-essential
gcc --version
gcc的常用命令
gcc -c
gcc -o
gcc -o program program.c -L. -lfoo // -L.表示在当前目录下查找函数库
ar crv : 将两个.o文件合并成一个库函数文件
nm命令: 查看那些函数包含在目标文件, 函数库或可执行文件
ldd命令: 查看一个可执行程序所需要的共享库
(base) asgter@asgter-TM1613:~/Linux/C/funclib$ ldd program linux-vdso.so.1 => (0x00007ffe2cfb8000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdd6b74d000) /lib64/ld-linux-x86-64.so.2 (0x00007fdd6bb17000)
C语言的3种格式
1 .c或.h 结尾的文件就是字符串形式的文本
.c 结尾的文件中带有main函数的, 是程序会执行的文件; 不带main的就是函数库文件了
.h 结尾的文件, 是前面.c文件定义的函数的函数声明
2 .o 结尾的文件就是二进制字节, 其中可能把引用的头文件添加到二进制字节中了
3 可执行程序, 是将.o文件与所引用的库函数文件(也是.o结尾的) 合并到一起, 形成一个可执行文件
gcc -o 可以直接将.c结尾的文件 转成可以 ./ 执行的文件
gcc -c 将.c结尾的文件转成.o结尾的文件
Linux下编写C语言程序
第一种方式:
1. vim fred.c // fred.c是一个函数定义文件
vim lib.h // fred.c中定义的函数的函数声明, 这是一个头文件
vim program.c // main函数所在的c文件, main中要include lib.h
2. gcc -c fred.c // 将fred.c编译成.o (本质上就是把头文件中的函数声明加进来)
gcc -c program.c
3. gcc -o program program.o bill.o // 将main主程序和库函数链接到一起, 形成可执行文件program
第二种方式:
1. vim fred.c vim bill.c // fred.c和bill.c是函数定义文件
vim lib.h // fred.c中定义的函数的函数声明, 这是一个头文件
vim program.c // main函数所在的c文件, main中要include lib.h
2. gcc -c fred.c // 将fred.c编译成.o (本质上就是把头文件中的函数声明加进来)
gcc -c bill.c
3. ar crv libfoo.a bill.o fred.o // 将两个.o文件合并成一个.a的函数库文件
4. gcc -o program program.o libfoo.a // 生成可执行文件
静态库与共享库
静态库: .a结尾的文件
当你同时运行许多应用程序并且他们都使用来自用一个函数库的函数时,
内存中就会有同一函数的多份副本, 而且在程序文件自身中也有多份同样的副本
静态库对应Windows中的.LIB文件
共享库: .so结尾的文件
共享库的保存位置与静态库一样,但共享库是.so结尾的
Linux中, 标准数学库的共享版本是/usr/lib/libm.so
共享库对应与Windows中 的.DLL文件
共享库的使用机制:
当一个程序使用共享库时, 程序本身不再包含函数代码, 而是引用运行时可访问的共享代码.
当编译好的程序被装在到内存中执行时, 函数引用被解析并产生对共享库的调用,
如果有必要, 共享库才被加载到内存