1、通过gcc生成可执行文件的另一种方法:
(1)gcc hello.c -I./include/ (一步到位生成a.out可执行文件)
头文件在当前路径下没有,这时用-I指定一个包含所需头文件的路径(/include/),这样的话我们就可以直接使用所需的头文件了。
(2)./a.out (执行a.out)
2、指定生成的可执行文件的名字为A:
gcc hello.c -I./include/ -o A
然后执行./A命令同样可以输出结果。
3、gcc编译参数
-I(大写的i):包含头文件路径(可以是绝对路径,也可以是相对路径)
-O:(后面紧跟1或2或3,优化选项),数值越大优先级越高。
-L:包含的库路径
-l(小写的L):后面跟库名(指定库名)。如要指定libxxx.so这个库,用法:-lxxx(掐头去尾,把lib和.so去掉)
-c:编译生成.o文件
-o:生成目标文件
-g:用于gdb调试,不加此项不能进行gdb调试。
-Wall:显示更多的警告(W警告all显示更多的警告)
-E 输出到标准输出,宏替换,头文件展开
-S 编译成汇编语言
-D:指定宏定义
-lstdc++:编译c++代码
4、编译.cpp文件生成可执行文件有两种方法:
方法一:
方法二:
5、静态库(以.a结尾)
静态库的制作步骤:
(1)利用gcc将.c文件编译为.o文件
(2)将.o文件打包(ar rcs libxxx.a(要制作的库的名字) x.o xxx.o(.o文件,可以有多个))
(3)将头文件和库一起发布
静态库的使用:编译时需要加静态库的名字(记得路径),-I(大写的i)包含头文件。
静态库的优点:执行速度快;发布应用时不需要发布库。
静态库的缺点:库变化更时需要重新编译应用;执行程序体积会较大。
静态库的文件命名:libxxx.a 其对应windows中的lib文件。
(1)生成.o文件,再生成libxxx.a文件。(我这里的xxx是hello)
可以用nm命令查看库文件内容:
例子:
6、动态库(以.so结尾)
动态库的制作步骤:
(1)编译与位置无关的代码,生成.o文件。要用到参数-fPIC(与位置无关)
(2)将.o文件打包(-shared,-o指定库名,后面加上原材料xxx.o)
(3)将头文件和库一起发布
动态库的使用:
(1)指定动态库的路径(所需参数比如:L等,和静态库差不多)
(2)执行的时候不能找到动态库的解决办法:
- 拷贝到系统的库路径下(不推荐)
- 修改LD_LIBRARY_PATH环境变量,将库所在的路径添加到环境变量中,用冒号分割。
- 修改sudo vi /etc/ld.so.conf,添加库路径在文件中,sudo ldconfig -v (加-v是动态显示加载过程,不加也行)
动态库的优点:执行程序体积小;库变更时一般不需要重新编译应用。
动态库的缺点:执行时需要加载动态库,相对而言,比静态库慢;发布应用时,需要同时发布动态库。
发布动态库:
另一种方法:
第三种方法:
sudo vi /etc/ld.so.conf(在这里面添加路径,如:/home/zyy/lib)
sudo ldconfig -v (加-v是动态显示加载过程,不加也行)
然后输入echo $LD_LIBRARY_PATH会显示用户在/etc/ld.so.conf中添加的路径。