2

ST ARM-Cortex-M3 でベアメタル C アプリケーションを開発しています。また、これらすべてのアプリケーションで使用できるライブラリも開発しました。

以前は Keil ARM-MDK を使用していましたが、GNU-GCC に移行したいと考えています。そこで、GCC の最新バージョンをダウンロードし、コードの再コンパイルを開始しました。

これと同様の質問に回答がありましたが、問題が解決しないため、質問を投稿します。

次の問題があります: Lib_Flash には関数 Read_Flash() があります。Lib_AppCfg は、Read_Flash() を使用するため、Lib_Flash にリンクします。私のアプリケーション (アプリ) は、Lib_Flash と Lib_AppCfg の両方にリンクしています。アプリは、いくつかの特定の FLASH チェックにも Read_Flash() を使用します。Keil MDK-ARM では問題なく動作しました。GCC では、Lib_AppCfg を使用する関数をビルドすると、Read_Flash() が「未定義の参照」であるというエラーが表示されます。問題がどこにあるのかわかりません。Lib_Appcfg のリンクにあるのでしょうか、それとも App をリンクするときに問題がありますか?

お知らせ下さい。追加情報が必要な場合は、お知らせください。

4

2 に答える 2

2

ライブラリに順序付けの問題があるように思えます。一部のリンカーは、すべての参照が解決される (または解決できない) まで、コマンド ラインですべてのライブラリを再スキャンします。他のリンカーは、リンク ラインに沿って順次動作します。

特に、これは、ライブラリ A がシンボル SYM_A を定義し、ライブラリ A がこのシンボルを参照した後に来るライブラリ B を定義すると、2 番目のタイプのリンカーで解決されず、リンクが失敗することを意味します。

これを回避するには、次の 1 つ以上を実行できます。

  1. ライブラリを並べ替える
  2. 必要に応じてリンク行でライブラリを複製します
  3. ライブラリ間の相互依存関係がないようにライブラリをリファクタリングします (つまり、A は B で定義されているシンボル SYMB を参照しますが、B は SYMA を参照します)。
于 2012-08-31T14:40:28.583 に答える
1

デフォルトでは、GNU リンカーは、コマンド ラインにリストされている順序でライブラリを 1 回検索します。そのため、リストの後のライブラリに、以前のライブラリまたはオブジェクト ファイルで定義されたシンボルへの参照がある場合、それは解決できません。

簡単な解決策は、ライブラリのグループ化を使用することです。これにより、シンボルが解決できなくなるまで、リンカーはライブラリのリストを繰り返し検索します。リンカー (ld) を個別に呼び出す場合、リンカーのオプションは次のとおりです。

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

または代替フォーム

-( _Flash _AppCfg -)

詳細については、GNU リンカのマニュアルを参照してください。gcc を介してリンカーを間接的に駆動する場合は、次のように-Wl オプションを介してリンカー オプションを渡します。

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

おもう。

于 2012-08-31T20:16:18.200 に答える