欢迎光临散文网 会员登陆 & 注册

linux应用基础之GCC编译器

2023-03-21 17:55 作者:我会读心术哟  | 我要投稿

        在编写单片机程序时,有如keil,iar这类IDE开发工具来帮忙对程序进行一整套的编译,生成可执行文件,在linux一般公司都会要求懂编译过程,因为这开发过程中需要看懂makefile,而makefile的重要基础之一就是编译,所以GCC编译是学习linux的必经过程;

        首先第一步我们要了解GCC它能干啥,GCC能帮我们把.C文件编译成可执行文件(也就是我们所需要的目标文件),怎么编译的呢,编译过程如下:

    

gcc编译过程

     总结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)








linux应用基础之GCC编译器的评论 (共 条)

分享到微博请遵守国家法律