負責維護一個平臺開放SDK,一直是出Windows版本的,Linux有32位的歷來沒改過因此也沒編譯過。html
忽然說要一個Linux 64位的版本,以前搞這些的人已離職且沒有交接此部分,因而悲劇了。ui
找到歷史版本的代碼,引用的庫的代碼,還有一個so的代碼在哪裏都沒找到,一個一個編過來。this
遇到以下錯誤,記錄一下:.net
(1)error: array must be initialized with a brace-enclosed initializerunix
出錯的代碼是指針
va_list a1 = NULL;htm
在Windows上沒有問題,Linux32位貌似也編得過,Google的結果是blog
標準並無要求va_list 能夠賦值,也沒有說va_list 是內建類型或者是聚合類型。
因此一些C語言實現中va_list 能夠相互賦值, 不表明va_list 在全部C語言實現中均可以相互賦值。ci
http://bbs.chinaunix.net/thread-1631360-1-1.htmlget
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代碼是刪減版,缺一些編譯須要的配置文件……
這也太不靠譜了,話說我當年剛進公司不久接手的一個工做就有這個問題:用到了第三方的東西,結果沒有維護,我拿到之後正常功能都使用不了,搞了很久才把配置庫上的東西補齊成一個完整的能用的工程……當時要求每一個人都提持續改進,我還把管理第三方組件的建議做爲交差提上去了,被駁回了。