写博客的目的就是为了自己以后方便查阅和总结自己的经验。最近的我有开始弄Linux应用程序(gui编程,pc端弄完弄到Linux平台去编译)。许久没有弄,碰到了好几个编译的大坑。
一、交叉工具链的不同的问题
1、交叉编译就是:在一种平台上编译,编译出来的程序,是放到别的平台上运行,即编译的环境和运行的环境不一样,属于交叉编译,主要和嵌入式开发有关。
2、常用工具链有以下几种
arm-linux-gcc arm-linux-addr2line arm-linux-objcopy arm-linux-readelf arm-linux-ar arm-linux-ld arm-linux-objdump arm-linux-size arm-linux-nm arm-linux-strip arm-linux-cc arm-linux-gprof arm-linux-c++filt arm-linux-as arm-linux-cpp arm-linux-gccbug arm-linux-ldd arm-linux-populate arm-linux-strings arm-linux-c++ arm-linux-g++ arm-linux-gcov arm-linux-ranlib |
二、动态库和静态库的区别(自我体会,不是很详细全面)
1、名称区别
动态库:libxxx.so
静态库:libxxx.a
2、编译调用区别
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
3、相同点
都是通过.o生成的
三、集成动态库时,运行后报错:没有找到库文件xxx.o
xxx.o是个过程文件,运行时却去寻找这个文件,这种错误是未知问题。
尝试1:修改xxx.c的文件名为nnn.c,编译,运行还是报错。但是名字改成了我修改的nnn.o
基本确定是Makefile的问题。
最后发现 我编译.o时用的命令是:gcc -o $@ $< $(CFLAGS)
修改成:gcc -c -Wall -o $@ $< $(CFLAGS)即可。
-c:只激活预处理,编译,和汇编,也就是他只把程序做成obj文件。
换句话说:-c 编译和汇编,但不要链接。
四、.c文件和.cpp文件对应的编译工具链
.c文件:gcc
.cpp文件:g++