【Linux 编译】记录几个大坑!

写博客的目的就是为了自己以后方便查阅和总结自己的经验。最近的我有开始弄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++

 

你可能感兴趣的:(Linux,linux,嵌入式,c++)