大费周章将libosmscout在vs平台上编译成功了,虽然已经有了readme编译手册,但是其依赖的其他开源库较多,一点的差错都不能有。
若将libosmscout移植到QNX,一个新的平台上,发生什么意外都不奇怪了。所以libosmscout里几个工程,只选取最基本的,不依赖其他库的libosmscout工程进行移植。
这里总结下移植过程中遇到的问题:
1. 随时准备调整config.h和CoreFeatures.h文件中的预定义
在linux平台上,这两个文件时由autoconf根据参数和环境生成的。里面是与头文件相关的预定义的宏。不同的环境,其宏定义可能也不同。如
/* Define to 1 if you have the declaration of `log2(double)', and to 0 if you don't. */ #undef HAVE_DECL_LOG2 /* Define to 1 if you have the <dlfcn.h> header file. */ #define HAVE_DLFCN_H 1 /* Define to 1 if you have the <inttypes.h> header file. */ #define HAVE_INTTYPES_H 1
其中费了一天 的功夫去理解其参数文件configure.ac,对宏定义修改有点帮助,但希望能直接弄明白宏定义的设置与要求的心思白费了。
2. 有关支持SSE, SSE2的部分,若设置编译选项__SSE__, __SSE2__,出现__buildin_ia32_***之类的错误时,应用-msse, -msse2替代__SSE__, __SSE2__,基本好用。原因大概是__SSE__, __SSE2__支持32位运算时没有问题,但对支持AMD 64运算时,需要应用扩展的设置-msse, -msse2。
3. 将头文件,源文件直接整个放入新建的QNX工程,编译,竟出现了上千个错误,很多是QNX内部头文件的错误,原因不明,原以为是config.h和CoreFeature.h中的宏设置的问题,努力折腾了两天,修改尝试了很多次,无功而返。
4. 无奈下,新建QNX工程,将libosmscout的文件逐个或分批加入新的QNX工程。在配置与以前中的QNX相同的情况下,编译错误大大减少,且有章可循。
在QNX中,常用的math函数,stdio中的输入输出函数,都需要在前面加上std域,如log,printf,exit等。否则,会出现无声明的错误。
time函数,需要指定include下的time.h,而不能是sys/time.h,否则time函数无声明。
其他编译都很顺畅。
其实,采用新的方法移植,总共没费两个小时的工作量。但在前一个方法里几乎耗费了一个星期,汗死。
如果再遇到开源莫名其妙的错误,选用逐个文件解决的方法,也是没办法的办法了。