2

必要なすべてのシンボルを見つけるために特定の順序でリンクする必要があるいくつかのオブジェクト ファイルを使用する C プロジェクトがあります。

たとえば、このコマンドは正常に機能します (lib2.o は lib1.o に依存するなど)。

gcc -o my_app main.o lib1.o lib2.o lib3.o -lm

しかし

gcc -o my_app main.o lib3.o lib2.o lib1.o -lm

`my_variable' エラーへの未定義の参照で終了します。

これは既知の動作であり、たとえばこれらのオブジェクトをリンカー スクリプトの GROUP セクションに追加することで解決できます。

これらのオブジェクトをスタティック ライブラリとして同僚と共有したいと思います。そう...

ar -rcs mylib.a lib1.o lib2.o lib3.o
gcc -o my_app main.o mylib.a -lm

残念ながら、これにより、オブジェクトを間違った順序で指定するなど、同じ未定義の参照エラーが発生します。

この問題が比較的一般的であると思われる場合でも、それを機能させるためのリンカまたはアーカイバのオプションは見つかりませんでした。また、グーグルによる解決策もありません。

誰か解決策を教えてください。

よろしく1月

4

2 に答える 2

3

これは、リンク順序の問題である可能性があります。GNU リンカがライブラリを検出すると、必要のないすべてのシンボルを破棄します。また、左から右への順序でそれを行います。

--as-neededgcc/ld の最近のバージョンでは、デフォルトでフラグ付きのリンクが設定されています。

これは-lmylib.a、C ファイルの前に記述すると、ライブラリが自動的に除外されることを意味します (このように「必要」かどうかをテストする場合、順序が重要になります)。

これは、次のいずれかで修正できます。

  1. gcc -L. -o example example.c -lmylib.a
  2. gcc -L. -Wl,--no-as-needed -o example example.c -lmylib.a

後者は--no-as-neededリンカーに渡されるため、外部の関数を呼び出さなくてもライブラリがリンクされたままになります。

于 2012-08-03T10:36:49.253 に答える
0

あなたのエラーは、問題が lib?.o ファイルの 1 つにあることを意味します [lib{later}.o は lib{earlier}.o に依存します]
どうやってそれらをコンパイルできましたか?
コンパイルの警告はありましたか?
Cを使用してからしばらく経ちましたが、依存関係のあるライブラリ内に依存ライブラリを含める必要があると思います-これが、問題への参照が多すぎる理由を見つけることができない理由かもしれません.実際には存在しません。

于 2012-08-03T10:16:28.417 に答える