【c++】-Linux gcc编译、静态库、动态库

gcc编译过程

预处理 --> ( * .i) 编译 -->( * .s汇编文件) 汇编–>( * .o二进制机器码) 链接–>可执行文件

  1. 预处理:预处理器将源文件对应的宏展开 gcc -E test.c -o test.i
  2. 编 译:gcc将c文件编译成汇编文件 gcc -S test.i -o test.s
  3. 汇 编:利用as命令(汇编器)将汇编文件编译成机器码(二进制) as test.s -o test.o
  4. 链 接:将目标文件与外部符号链接,得到可执行二进制文件 gcc test.o -o test

静态库和动态库的区别

windows:静态库( * .lib) 动态库( * .dll)
linux :静态库( * .a)动态库( * .so)

动态库只在执行时才被链接使用,不是直接编译为可执行文件,并且一个动态库可以被多个
程序使用,故可称为共享库
静态库将会整合到程序中,在程序执行时不用加载静态库。
因此,静态库会使你的程序臃肿并且难以升级,但比较容易部署。而动态库会使你的程序轻
便易于升级但难以部署

如果在编译时,某个程序链接静态库,则链接器会搜索库并直接拷入可执行文件中(利于部署,但过于臃肿);对于动态库,在编译时并不会被链接到代码中,而是在运行时才会被载入(不利于部署,但程序轻便)

创建静态库

gcc -c add.c 
ar crsv libadd.a add.o
gcc -o add.exe testadd.c -ladd -L.//-L.为设置为当前路径,也可直接将.a文件复制到 /usr/local/lib目录下)

创建动态库

gcc -fPIC -Wall -c add.c
gcc -shared -o libadd.so add.o
sudo cp libadd.so /usr/local/lib  //当做好动态库后,要把动态库移到 /usr/local/lib,再执行以下命令
sudo ldconfig   //该命令会更新/etc/ld.so.cache的内容,将新加入的库路径写入其中,这样,可执行程序就可以在执行时找到动态库
gcc -o add.exe testadd.c -ladd
发布了43 篇原创文章 · 获赞 4 · 访问量 1192

猜你喜欢

转载自blog.csdn.net/weixin_42176221/article/details/105203735