2012-08-31 22 views
2

我正在ST ARM-Cortex-M3上開發裸機C應用程序。我還開發了可在所有這些應用程序中使用的庫。將幾個相關庫鏈接到我的「裸機」C應用程序中

我曾經使用Keil ARM-MDK,但想要移到GNU-GCC。於是我下載了最新版本的GCC並開始重新編譯代碼。

儘管類似的問題已經得到解答,但它並沒有解決我的問題,因此我發佈了我的問題。

我遇到以下問題: Lib_Flash有一個函數Read_Flash()。因爲它使用Read_Flash(),Lib_Flash中的Lib_AppCfg鏈接。 我的應用程序(App)鏈接在Lib_Flash和Lib_AppCfg中。 App還使用Read_Flash()進行一些特定的FLASH檢查。 在Keil MDK-ARM中它工作正常。 使用GCC時,當使用Lib_AppCfg函數構建時,會出現錯誤,指出Read_Flash()是「未定義的引用」。 我不確定問題出在哪裏。它是鏈接的Lib_Appcfg是內置的還是當我鏈接應用程序的問題?

請指教。如果您需要更多信息,請告訴我。

+0

這是一個鏈接錯誤。你能告訴我們你的編譯命令嗎? – Linuxios

+0

您是否嘗試重複'Lib_Flash'庫,如'gcc app.c -o app -lFlash -lAppCfg -lFlash'? –

+0

@AlexandreC:GNU鏈接器可以使用分組選項更智能地實現這一點 - 請參閱我的答案。這說你「評論」是一個回答,而不是對這個問題的評論,爲什麼不把它作爲一個? – Clifford

回答

1

默認情況下,GNU鏈接器會按照命令行中列出的順序搜索庫。因此,如果稍後列表中的庫具有對在早期的庫或對象文件中定義的符號的引用,則無法解析它。

簡單的解決方案是使用庫分組;這會導致鏈接程序重複搜索庫的列表,直到不再解析synobols。如果單獨調用鏈接器(LD),然後鏈接器選項爲:

--start-group _Flash _AppCfg --end-group 

或替代形式

-(_Flash _AppCfg -) 

有關詳細信息,請參閱GNU linker manual。如果通過GCC驅動連接器間接傳遞通過-Wl option連接選項,是這樣的:

-Wl,-(,_Flash,_AppCfg,-) 

我想。

+0

感謝Clifford,--start-group和--end-group工作得很好:) – HvW

2

這聽起來像你在你的圖書館有一個訂購問題。一些鏈接程序將重新掃描命令行上的所有庫,直到解決所有引用(或無法解析)。其他鏈接器沿鏈接線順序工作。

特別是,這意味着如果庫A定義了一個符號SYM_A和庫B,它在庫A引用該符號之後出現,它將不會在第二種類型的鏈接器上解析,並且鏈接將失敗。

爲了避開這一點,你可以做一個或多個以下

  1. 重新排序的鏈接行庫
  2. 重複文庫,其中 必要
  3. 重構您的庫,以便有沒有它們之間的相互依存關係 (即A引用符號SYMB,其 在B中定義,而B引用SYMA)
相關問題