选择性编译:
也就是我们常用的ifdefine防止头文件多次重复编译
#ifdef AAA
#else
#endif
动态编译:
动态编译是使用的动态库文件进行编译
gcc hello.c -o hello(一步到位)
默认使用的是动态编译的方法
静态编译:
静态编译使用的静态库文件进行编译
gcc -static hello.c -o hello
静态编译和动态编译的区别:
1.使用的库文件的格式不同
动态编译:使用动态库
静态编译:使用静态库
制作静态库
gcc -c mylib.c -o -mylib.o //.o是汇编产生的二进制文件,也是可执行文件的上一步
ar rc libtestlib.a mylib.o
//注意静态库起名是必须以lib开头,以.a结尾
编译程序
方法1:
gcc -static mytest.c(主调函数) libtesrlib.o(静态库) -o mytest
方法2:可以指定头文件以及库文件路径
例如:libtest.a mylib.h 移动到/home/teacher
mv libtestlib.a mylib.h /home/teacher
程序命令
gcc -static mytest.c -o mytest -L/home/teacher -ltestlib -I/home/teacher
-L:指定库文件路径
-l(小写L):指定找那个库文件,指定的库文件只要lib后,.a前面的部分
-I(大写i) :指定头文件的路径
方法3:将库文件及头文件放到系统默认指定的路径下
库文件默认的路径是: /lib或/usr/lib
头文件的默认路径是:/usr/include
sudo mv libtestlib.a /usr/lib
sudo mv mylib.h /usr/include
编译命令:gcc -static mytest.c -o mytest -ltestilb
制作动态库连接库
gcc -shared mylib.c -o libtestlib.so //lib和.so是固定中间名自己起
//使用gcc编译制作动态链接库
动态连接库的使用方法
方法1:库函数,头文件均在当前目录下
gcc mytest.c libtestib.so -o mytest
方法2:库函数头文件假设在/opt目录下
gcc mytest.c -o mytest -L/home/teacher -ltestlib -I/home/teacher
编译通过,运行时出错,编译时找到了库函数,但连接时找不到库
执行以下操作:
export LD_LIBRARY_PATH=/:$LD_LIBRARY_PATH
./是当前目录下
路径和路径用:分割
#./mytest 可找到动态链接库
方法3:库函数,头文件均在系统路径下
cp libtestlib.so /usr/lib
cp mylib.h /usr/include
gcc mytest.c -o mytest -ltestlib
#./mytest
注:当静态和动态库重名时,默认优先动态库。或者加入-static指定静态库