Linux系统编程笔记_1(GCC 静态库动态库)

本文介绍了GCC在Linux系统编程中的使用,包括预处理、编译、优化选项如-Wall和-O。讲解了静态库和动态库的创建与使用,强调了动态库的环境变量配置及注意事项,探讨了两者之间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

- GCC

在这里插入图片描述在这里插入图片描述
-o单独使用是直接生成可执行文件,配合使用就是指输出到xxx的文件里,不加-o的话就会用默认的名字a.XXX
比如gcc test.c -E -o test.i
把test.c预处理的文件命名为test.i

khl@khl-virtual-machine:~/linux/lession02$ gcc test.c -E -o test.i
khl@khl-virtual-machine:~/linux/lession02$ ls
a.out  app  test.c  test.i
khl@khl-virtual-machine:~/linux/lession02$ gcc test.i -S -o test.s
khl@khl-virtual-machine:~/linux/lession02$ ls
a.out  app  test.c  test.i  test.s
khl@khl-virtual-machine:~/linux/lession02$ gcc test.s -c -o test.o
khl@khl-virtual-machine:~/linux/lession02$ ls
a.out  app  test.c  test.i  test.o  test.s
khl@khl-virtual-machine:~/linux/lession02$ gcc test.o -o test.out
khl@khl-virtual-machine:~/linux/lession02$ ls
a.out  app  test.c  test.i  test.o  test.out  test.s
khl@khl-virtual-machine:~/linux/lession02$ ./test.out 
Hello World

可以对源文件直接进行后面的操作,不必一步一步进行
gcc test.c -S 直接编译
gcc test.c直接成为可执行代码

khl@khl-virtual-machine:~/linux/lession02$ ls
a.out  app  test.c  test.i  test.o  test.out  test.s
khl@khl-virtual-machine:~/linux/lession02$ rm a.out app test.i test.o test.s
khl@khl-virtual-machine:~/linux/lession02$ ls
test.c  test.out
khl@khl-virtual-machine:~/linux/lession02$ rm test.out 
khl@khl-virtual-machine:~/linux/lession02$ ls
test.c
khl@khl-virtual-machine:~/linux/lession02$ gcc test.c -S
khl@khl-virtual-machine:~/linux/lession02$ ls
test.c  test.s
khl@khl-virtual-machine:~/linux/lession02$ gcc test.c
khl@khl-virtual-machine:~/linux/lession02$ ls
a.out  test.c  test.s

-D的用法 在运行的时候定义宏,使得代码里#ifdef的内容可见,一般用于调试

#include <stdio.h>

int main(){
    int a=10;
#ifdef DEBUG
    printf("我是一个程序猿\n");
#endif
    for(int i=0;i<3;++i){
        printf("hello,GCC!!!\n");
    }
    return 0;
}
khl@khl-virtual-machine:~/linux/lesson03$ gcc test.c -o test
khl@khl-virtual-machine:~/linux/lesson03$ ./test
hello,GCC!!!
hello,GCC!!!
hello,GCC!!!
khl@khl-virtual-machine:~/linux/lesson03$ gcc test.c -o test -D DEBUG
khl@khl-virtual-machine:~/linux/lesson03$ ./test
我是一个程序猿
hello,GCC!!!
hello,GCC!!!
hello,GCC!!!

在这里插入图片描述

-Wall 还是上面那个c代码,当中a定义了但没用上占内存

khl@khl-virtual-machine:~/linux/lesson03$ gcc test.c -o test -Wall
test.c: In function ‘main’:
test.c:4:9: warning: unused variable ‘a’ [-Wunused-variable]
     int a=10;
         ^

-On 优化 下面的代码是优化之后的
代码可以反汇编,也就是从可执行程序可以反着得到源代码,加了优化后,反汇编的源代码,和原来就不同了,之间的逻辑关系要猜测
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
-std,c89和c99的区别
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述
-c得到.o文件,不链接
head.h和main.c不用,head.h因为它包含在add.c、sub.c…这四个文件中,预编译的时候包含进去
main.c是测试代码也不用

khl@khl-virtual-machine:~/linux/lesson04/calc$ gcc -c add.c sub.c mult.c div.c 
khl@khl-virtual-machine:~/linux/lesson04/calc$ tree
.
├── add.c
├── add.o
├── div.c
├── div.o
├── head.h
├── main.c
├── mult.c
├── mult.o
├── sub.c
└── sub.o
khl@khl-virtual-machine:~/linux/lesson04/calc$ ar rcs libcalc.a add.o div.o mult.o sub.o
生成静态库
khl@khl-virtual-machine:~/linux/lesson05/library$ tree
.
├── include
│   └── head.h
├── lib
│   └── libcalc.a
├── main.c
└── src
    ├── add.c
    ├── div.c
    ├── mult.c
    └── sub.c

使用静态库

gcc main.c -o app -I ./include/ -l calc -L ./lib
-I 指定head.h的搜索目录
-l 指定使用的库名  库名是calc  库文件名是libcalc.a  注意区别
-L 库的路径
./app 编译成可执行文件后就可以直接运行了
a = 20, b = 12
a + b = 32
a - b = 8
a * b = 240
a / b = 1.666667

在这里插入图片描述
动态库制作

gcc -c -fpic add.c div.c mult.c sub.c 
ls
add.c  add.o  div.c  div.o  head.h  main.c  mult.c  mult.o  sub.c  sub.o
gcc -shared add.o sub.o mult.o div.o -o libcalc.so

使用动态库

gcc main.c -o main -I include/ -L lib/ -l calc
ls
include  lib  main  main.c  src
./main 运行报错
./main: error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or directory

在这里插入图片描述

$ ldd main
	linux-vdso.so.1 (0x00007fffde9cb000)
	libcalc.so => not found
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0b980c8000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f0b986bb000)

一、添加在环境变量中

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/khl/linux/lesson06/library/lib
echo $LD_LIBRARY_PATH
:/home/khl/linux/lesson06/library/lib

就能找到动态库的位置了

khl@khl-virtual-machine:~/linux/lesson06/library$ ldd main
	linux-vdso.so.1 (0x00007ffd2a3ee000)
	libcalc.so => /home/khl/linux/lesson06/library/lib/libcalc.so (0x00007f61a224a000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f61a1e59000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f61a264e000)
khl@khl-virtual-machine:~/linux/lesson06/library$ ./main
a = 20, b = 12
a + b = 32
a - b = 8
a * b = 240
a / b = 1.666667

但是这样配置的只在当前终端临时有效,如果关闭当前终端再开一个新的就无效了
解决办法有两种,一种是用户级别的配置,一种是系统级别的配置
①用户级别的配置
修改home下的.bashrc文件
在这里插入图片描述
尾部添加上面一样的内容
在这里插入图片描述

khl@khl-virtual-machine:~$ . .bashrc  执行,相当于source .bashrc

②用户级别的配置
类似用户的 修改的文件变为

khl@khl-virtual-machine:~$ sudo vim /etc/profile

内容一样
在这里插入图片描述

khl@khl-virtual-machine:~$ source /etc/profile

如果之前以用户的方式修改过了,记得把之前的用户修改的那个端口关掉,不然会混乱
二、添加在/etc/ld.so.cache文件列表
不能直接修改

khl@khl-virtual-machine:~$ vim /etc/ld.so.cache  里面是二进制

间接

khl@khl-virtual-machine:~$ sudo vim /etc/ld.so.conf

直接把路径复制到里面
在这里插入图片描述
保存并更新

khl@khl-virtual-machine:~$ sudo ldconfig  更新 

三、不建议把我们的动态库文件放在/lib 或 /usr/lib的目录下
因为它们本身就包含了系统自带的库文件,怕自己的动态库文件会和系统的重名,发生错误

动态库和静态库的对比
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值