突然说要一个64位版本,然后遇到很多错误

负责维护一个平台开放SDK,一直是出Windows版本的,Linux有32位的从来没改过所以也没编译过。

突然说要一个Linux 64位的版本,之前搞这些的人已离职且没有交接此部分,于是悲剧了。

找到历史版本的代码,引用的库的代码,还有一个so的代码在哪里都没找到,一个一个编过来。

遇到如下错误,记录一下:

(1)error: array must be initialized with a brace-enclosed initializer

出错的代码是

va_list a1 = NULL;

在Windows上没有问题,Linux32位貌似也编得过,Google的结果是

标准并没有要求va_list 可以赋值,也没有说va_list 是内建类型或者是聚合类型。
所以一些C语言实现中va_list 可以相互赋值, 不代表va_list 在所有C语言实现中都可以相互赋值。

http://bbs.chinaunix.net/thread-1631360-1-1.html

The specifics of this type depend on the particular library implementation.

http://www.cplusplus.com/reference/cstdarg/va_list/

(2)make: warning:  Clock skew detected.  Your build may be incomplete

修改前面编译错误是在Windows电脑上,比编译用的Linux机器时间快一些

这个错误是由于系统时间比文件修改时间早造成的,一般可以通过修改系统时间来消除错误

http://www.cppblog.com/windcsn/archive/2011/05/18/146675.html

(3)No rule to make target ` XXX ', needed by `yyy'.

低级错误,修改makefile的时候有文件名忘了从libxxx32改成libxxx64

http://www.yayu.org/book/gnu_make/make-15.html

(4)error: cast from 'void*' to 'int' loses precision

64位指针长度超过int,所以又一堆错误出现了…

临时改成了long,能解决问题

http://blog.csdn.net/hfw_1987/article/details/5752490

有空需要再研究下stackoverflow上的讨论

http://stackoverflow.com/questions/1640423/error-cast-from-void-to-int-loses-precision

(5)编译ACE时遇到不少错误,心里奇怪怎么按照网上的按部旧搬都编译不过,后来找了人帮我看,

原来找到的SVN上的ACE代码是删减版,缺一些编译需要的配置文件……

这也太不靠谱了,话说我当年刚进公司不久接手的一个工作就有这个问题:用到了第三方的东西,结果没有维护,我拿到以后正常功能都使用不了,搞了好久才把配置库上的东西补齐成一个完整的能用的工程……当时要求每个人都提持续改进,我还把管理第三方组件的建议作为交差提上去了,被驳回了。

原文地址:https://www.cnblogs.com/zcdqs/p/3339880.html