今天交叉编译sqlite3,用codeblocks编译后,发现编译可以通过,链接的时候,提示不能找到 libsqlite3.so文件,查找核实了一下路径,发现没有问题,文件确实放在那里。
在网上找了一下,发现有人遇到和我类似的问题:
make的时候报错:
sqlite3-shell.o: file not recognized: File format not recognized
collect2: ld returned 1 exit status
Makefile:410: recipe for target 'sqlite3' failed
文件格式不对,查了一下sqlite3-shell.o的文件格式
file sqlite3-shell.o
sqlite3-shell.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
是x86-64的,而我要编译的是arm版本的,所以这里报错了。
刚开始,还以为是数据位数的原因,核实了一下,NUC970是32位处理器,用file libsqlite3.so查看了一下,发现也是32位的,没有问题。
再后来发现问题是出在我codeblocks是在release模式下编译的,是交叉编译工具链编译的。而sqlite3是GNU GCC编译的,即项目工程是用交叉编译工具编译的,而sqlite3是用宿主机的编译器编译的,造成两者放到一起后不能识别的问题。到此问题找到。
重新用交叉编译工具,编译了sqlite3,重新指定目录后,编译通过。
另外通过这次调试也发现,codeblocks的build messages可以看到程序中是否有语法错误,而build log可以提示链接阶段的错误。只发现编译没有语法错误还不行,必须两者都要没有问题才行。当链接没有错误时,会output size is xx KB的文件,如果没有说明就是有问题,需要排除。