linux应用基础之GCC编译器
在编写单片机程序时,有如keil,iar这类IDE开发工具来帮忙对程序进行一整套的编译,生成可执行文件,在linux一般公司都会要求懂编译过程,因为这开发过程中需要看懂makefile,而makefile的重要基础之一就是编译,所以GCC编译是学习linux的必经过程;
首先第一步我们要了解GCC它能干啥,GCC能帮我们把.C文件编译成可执行文件(也就是我们所需要的目标文件),怎么编译的呢,编译过程如下:

总结GCC的使用
多文件编译:
gcc -c -o main.o main.c
gcc -c -o sub.o sub.c
gcc -o test main.o sub.o
生成静态库:
首先,将代码文件编译成目标文件.o(StaticMath.o)
g++ -c -o StaticMath.cpp
注意带参数-c,否则直接编译为可执行文件
然后,通过ar工具将目标文件打包成.a静态库文件
ar -crv libstaticmath.a StaticMath.o生成静态库libstaticmath.a。
静态库的使用:
gcc -o test main.o libsub.a,不需要吧静态库放到板子上
生成动态库:
gcc -c -fPIC -o sub.o sub.c
gcc -shared -o libsub.so sub.o
或者
gcc -shared -fPIC -o libsub.so sub.c交叉编译需要在最后面加上 -fPIC 参数
不加-fPIC的SO库需要进行重定位才能找到函数;
加-fPIC的SO库会在连接时生成位置虚拟列表,不需要进行位置重定位;
动态库的使用:
gcc -o test main.o -lsub -L /libsub.so/ 所在目录/,需要先把 libsub.so 放到 Ubuntu 的/lib 目录
如果不想把 libsub.so 放到/lib,也可以放在某个目录比如/a,执行
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/a
容易碰到的编译选项,记住选项参数就行
gcc -E -dM main.c > 1.txt // 把所有的宏展开,存在 1.txt 里
gcc -Wp,-MD,abc.dep -c -o main.o main.c // 生成依赖文件 abc.dep ,后面 Makefile 会用
当我们在进行编译的时候免不了要去链接库文件,以下命令用来查询库文件和头文件分别放在那个目录下
echo 'main(){}'| gcc -E -v - // 它会列出头文件目录、库目录(LIBRARY_PATH)
把生成的动态库,或者静态库或者头文件分别放在这个目录下;
最后总结一下头文件和库文件被编译链接时候查询方式
头文件:指定目录查询(一般在工具链中查找)或者用-I dir
库文件:指定目录(一般在工具链中查找)或者-L dir
运行时候.so:/lib /usr/lib 自己制定目录(LD_LIBRARY_PATH)