- 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的目录下
因为它们本身就包含了系统自带的库文件,怕自己的动态库文件会和系统的重名,发生错误
动态库和静态库的对比