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文件。
制作过程
- 编译为.o文件 :gcc -c *.cpp -I …/inlude/
- 将.o文件打包:
ar rcs libmycalc.a file1.o file2.o
ar rcs libCalcpp.a *.o
- 将头文件与库一起发布
查看
nm libCalcpp.a
add.o:
0000000000000000 T _Z3addiidiv.o:
0000000000000000 T _Z3diviimul.o:
0000000000000000 T _Z3muliisub.o:
0000000000000000 T _Z3subii
使用
示例:g++ main.cpp -o app -I include/ -L lib/ -l Calcpp
- 编译时需要加静态库名(记得路径);-I 包含头文件
优缺点
- 优点: 1. 执行快 2. 发布应用时不需要发布库
- 缺点:1. 执行程序体积比较大 2. 库变更时需要重新发布
动态库
制作步骤
- 编译与位置无关的代码,生成.o文件,关键参数-fPIC
g++ -fPIC -c *.cpp -I ../include/
- 将.o文件打包:关键参数 -shared
g++ -shared -o libCalcpp.so *.o
- 将库于文件一起发布
使用
-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. 库变更时,一般不需要重新进行编译应用。