為了這個搞了一天... Q___Q
原來是用arm-elf-g++ 作compiler, linker。
link時出現..
undefined reference to `Fill(RKK *, long, long, unsigned long, unsigned long, unsigned long)'但是明明就在library裏呀,更奇妙的是另一個libray中call這個Fill的function竟然可以 正常link。
直接call Fill 就會有這個錯...
只好把相關source file都copy到local folder,重新寫一個minimum function。link obj file。
的確是發現使用時,有一些type convertion。加入cast後,就OK了。
但是... sample code為什麼就OK ??
所以...發現sample code用gcc作 compiler, linker。我用g++。
也改g++後,這個"undefined reference to.." 的error消失了。
改出現.."undefined reference to pow".. 這個只要加上math library : -lm 就OK了。
發現是compiler的關係,不是linker的關係。
用gcc作compiler ,compile出來的object code,link 就沒有 Fill ( )找不到的問題。
用g++作linker,就不會有 pow function 找不到的問題。
這大概是因為 g++ 的type check比較嚴謹。尤其 function argument上。
還有一點要注意的:
在修改Makefile的過程中,雖然一度曾經修改成正確的格式。但是一樣make fail。
這是因為前一次make fail 留下的*.elf, *.elf2flt 未刪除。造成linker只有拿elf, elf2flt作strip 的動作。沒有重新從obj --> elf.
所以要記得,要刪除這些未成工的file (或是把Makefile也加入dependency中)。
2 則留言:
well,會不會是因為部份 object code 的 symbol 已被 C++ name mangling 過了,所以會有找不到 reference 的問題呢?
-j
嗯,很可能喔。
記得以前C++的教科書中有說...多型的function會在function後加上argument typ2。
但是我用nm 列出obj 中所有的symble,卻沒有看到function name被改掉,真是奇怪呀。
張貼留言