最近Build Embedded System的程式,在寫Makefile的時候,有一個問題我竟然花了快1個小時才解決.
通常我們再寫大程式的時候(有許多程式),透過Makefile順利地將所有source code compile成計算機可以讀的OBJ檔.但是所有的obj檔要合併成一個真正的可執行檔則必須透過Linker的方式去重組裡面的程式位址(reloacation).
底下的指令是我原本寫的
$(LD) $^ -o sample.elf -nostartfiles $(LDFLAGS)
結果每次執行的結果
unreferenced to 'print'
類似這樣的錯誤訊息,這個錯誤訊息代表著你的程式裡面有用到外部的一個函式(不是在同一個檔案裡面),必須要參考到外部的函式的位址,這樣Linker程式才可以正確地算出所要呼叫的位址.
我都以為這樣的寫法沒有錯,害我以為是不是Linker的問題,還是其他問題.
結果我也不知道怎麼想的,我就把它的位置調整一下試試看
$(LD) -nostartfiles $^ -o sample.elf $(LDFLAGS)
再執行一次,竟然成功了!!
我想有可能Cross Compiler寫的沒有那麼smart.所以才會這樣!!