负责维护一个平台开放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代码是删减版,缺一些编译需要的配置文件……
这也太不靠谱了,话说我当年刚进公司不久接手的一个工作就有这个问题:用到了第三方的东西,结果没有维护,我拿到以后正常功能都使用不了,搞了好久才把配置库上的东西补齐成一个完整的能用的工程……当时要求每个人都提持续改进,我还把管理第三方组件的建议作为交差提上去了,被驳回了。