2

LinuxでC++を使用してモジュールをビルドしようとすると、厳しい「未定義の参照」エラーが発生しました。これについては大まかに説明し、必要に応じて後でコードを投稿します(独自仕様であるため、投稿するには名前を変更する必要があります)。いくつかの詳細:

  • モジュールA(ライブラリ)には、Barというメソッドを使用してFooと呼ぶクラスがあります。モジュールAは問題なくビルドされ、nmを使用してオブジェクトファイルを確認すると、コンストラクターとBarの両方が定義されていることがわかります(これらは「T」として表示されます)。
  • モジュールB(ライブラリ)には、Foo :: Foo、Foo ::〜Foo、およびFoo::Barを参照するモジュールAを使用するクラスが含まれています。そのmakefileには、-L / path / to/Fooと-lFooが含まれています。このモジュールも問題なく構築されます。ただし、モジュールBのオブジェクトファイルでnmを実行すると、モジュールFoo :: Foo、Foo ::〜Foo、およびFoo :: Barの呼び出しは定義されていません(「U」と表示されます)。なぜそれが構築されるのかは私を超えています。
  • モジュールC(出力は実行可能ファイル)には、モジュールBへの参照が含まれています。モジュールCをビルドしようとするとモジュールBからモジュールAのFooおよびBarメソッドへの未定義の参照を叫びます。

    1. 参照が未定義の場合、モジュールBがビルドされるのはなぜですか?
    2. モジュールCに到達したときにのみエラーが報告されるのはなぜですか?

編集:

  1. モジュールCのmakefileにも-L/path / to / Fooと-lFooがありますが、それでも失敗します。私が試してみるべきことについての高レベルの推測はありますか?コードを投稿しなければならないような気がします...
4

3 に答える 3

1

なぜそれが構築されなかったのか理解しました。これは、ここで発生したのと同じ問題です。

nmがこのシンボルが共有ライブラリに存在することを示している場合でも、シンボルへの未定義の参照

于 2012-07-17T17:47:06.547 に答える
0

共有ライブラリを作成する場合、すべてのシンボルを定義する必要はありません。この動作は、必要に応じてコンパイラ コマンドライン スイッチ (リンカー オプション --no-allow-shlib-undefined) で変更できます。

于 2012-07-17T17:06:42.580 に答える
0

モジュール B はビルドしますか、それとも単にコンパイルしますか? モジュール C をビルドする前に、実際にモジュール B をモジュール A にリンクしていますか? もしそうなら、私は驚きます。コンパイル段階では、コンパイラはすべての名前が宣言されていることのみをチェックします。コンパイラは定義 (つまり実装) を探しません。リンク段階では、この詳細を処理します。リンク段階では、プロジェクトのビルドに必要なすべてのモジュール(この場合は A、B、および C)を指定する必要があります。

于 2012-07-17T16:59:27.910 に答える