GCC的使用

本文详细介绍了GCC的编译参数,如-I、-O、-L、-l等,并通过实例展示了如何使用这些参数。同时,讲解了静态库和动态库的制作过程,包括静态库的libxxx.a和动态库的libxxx.so。讨论了静态库和动态库的优缺点,如静态库执行快但体积大,动态库体积小但需要依赖库文件。最后,针对动态库加载问题,提供了解决方案,如修改ld.so.conf文件和环境变量LD_LIBRARY_PATH。
摘要由CSDN通过智能技术生成

GCC的使用

GCC编译参数

  • -I --包含头文件路径(可以包含绝对路径也可包含行对路径)
  • -O --优化选项,1-3,越高优先级越强
  • -L --包含的库路径
  • -l --指定库名(通常libxxx.so,libxxx.a,-lxxx)
  • -o --目标文件
  • -c --编译成.o文件
  • -g --用与gdb调试,不加此选项不能gdb调试
  • -Wall --显示更多的警告
  • -D --指定宏编译
  • -lstdc++ --编译C++代码

示例:

g++ main.cpp ./head/head.cpp -I head.h -o app

g++ .cpp文件 -I 头文件路径 -o 编译好的文件名

g++ main.cpp ./head/head.cpp -I head.h -D DEBUG -o app

g++ .cpp文件 -I 头文件路径 -D 宏定义 -o 编译好的文件名

工作时采用,便于调试

g++ main.cpp ./head/head.cpp -I head.h -D DEBUG -o app -g

制作库文件

静态库

文件命名:libxxx.a —>>window的.lib文件。

制作过程

  1. 编译为.o文件 :gcc -c *.cpp -I …/inlude/
  2. 将.o文件打包:ar rcs libmycalc.a file1.o file2.o ar rcs libCalcpp.a *.o
  3. 将头文件与库一起发布

查看

nm libCalcpp.a

add.o:
0000000000000000 T _Z3addii

div.o:
0000000000000000 T _Z3divii

mul.o:
0000000000000000 T _Z3mulii

sub.o:
0000000000000000 T _Z3subii

使用

示例:g++ main.cpp -o app -I include/ -L lib/ -l Calcpp

  1. 编译时需要加静态库名(记得路径);-I 包含头文件

优缺点

  • 优点: 1. 执行快 2. 发布应用时不需要发布库
  • 缺点:1. 执行程序体积比较大 2. 库变更时需要重新发布

动态库

制作步骤

  1. 编译与位置无关的代码,生成.o文件,关键参数-fPIC g++ -fPIC -c *.cpp -I ../include/
  2. 将.o文件打包:关键参数 -shared g++ -shared -o libCalcpp.so *.o
  3. 将库于文件一起发布

使用

-L 指定动态库的路径 -l指定库名 g++ main.cpp -o main -I include/ -L ./lib/ -lCalcpp

解决不能加载动态库的问题

./main: error while loading shared libraries: libCalcpp.so: cannot open shared object file: No such file or directory

首先检查链接 其中 libCalcpp.so => not found 未找到

ldd main
linux-vdso.so.1 => (0x00007ffd793f9000)
libCalcpp.so => not found
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f8ce38b8000)
libm.so.6 => /lib64/libm.so.6 (0x00007f8ce35b6000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f8ce33a0000)
libc.so.6 => /lib64/libc.so.6 (0x00007f8ce2fd2000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8ce3bc0000)

解决办法

  • 将libCalcpp.so放在/lib或者/usr/lib下 用链接(软硬连接都行)

  • 添加到环境变量LD_LIBRARY_PATH中,不是特别推荐

    查看环境变量 echo $LD_LIBRARY_PATH

    export LD_LIBRARY_PATH = /home/…/…/:$LD_LIBRARY_PATH

    export LD_LIBRARY_PATH=/home/dai/C++/03test/02静态库与动态库/02动态库/lib:$LD_LIBRARY_PATH

  • 推荐方式

  • 编辑ld.so.conf文件:sudo vim /etc/ld.so.conf

  • 加入路径:/home/dai/C++/03test/02静态库与动态库/02动态库/lib

  • 更新设置:sudo ldconfig -v

优缺点

  • 缺点:1. 执行需要加载动态库,先对静态库较慢。 2. 发布应用时需要同时发布动态库。
  • 优点:1. 执行程序体积小。 2. 库变更时,一般不需要重新进行编译应用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

去留意

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值