gcc常用编译选项(头文件路径,库路径,运行动态库链接的目标文件)
常用编译选项
-E -c -o
-l 链接库文件(可以是 静态库 或 动态库)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
怎么编译多个文件
gcc -o test main.c sub.c -v
查看编译过程,先编译成.s文件,再汇编成.o文件,最后链接成可执行文件
多个源文件编译时,一个源文件被修改了,再跟上面编译一样编译的话,把没有修改的源文件也编译了,其实没有被修改的是不用编译的
改善上面的编译方法,先编译,再链接
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
********************************************************************************************************************************************************************************************************************
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
注意下面区别
1、<> 去工具链里默认指定目录寻找,找不到的话不会去当前目录找
2、" " 当前工作目录找,找不到去系统默认目录也就是工具链目录里面找
也就是说" "是万能的,只是会有顺序问题
-------------------------------扩展
编译error:no such file or directory解决办法如下:
1、可以添加自己目录:
-I 指定头文件目录
例如:gcc -c -o main.o main.c -I ./ -v
2、或者把头文件放到工具链指定目录里
执行命令gcc -o test main.c,出现undefined reference to 'sub_fun'错误,解决如下
gcc -o test main.c sub.c 还可把sub.c做成库(往下看)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
制作使用动态库
注意:上面编译动态库时可能会出错,解决如下
gcc -fPIC -o sub.o sub.c
gcc -shared -o libsub.so sub.o
编译两种方式:
运行2种方法:
1、库文件放到系统目录下
2、指定目录
制作使用静态库
静态库以.a结尾
main.o文件和libsub.a文件会打包在一起 gcc -o test main.o -lsub -L ../
很有用的选项
echo "main(){} " | gcc -E -v -
总结
运行时另一种方法, /etc/ld.so.conf 加入生成的库目录,然后ldconfig /etc/ld.so.conf