1

私はautotool環境にいます。

ライブラリを依存関係としてA使用するライブラリを開発しています。BC

  • でビルドBするlibtoolので、出力はlibB.la
  • Cシンプルな Makefile でビルドすると、出力は次のようになります。libC.a
  • A私もlibtoolでビルドし、出力はlibA.la

次に、これらのライブラリをリンクしたテスト プログラムを作成します。

Makefile.am以下です。

check_PROGRAMS = acc_test

AM_CPPFLAGS = -I$(top_srcdir)/include \
              -I$(top_srcdir)/deps/C/include \
              -I$(top_srcdir)/deps/B/include


LDADD = $(top_builddir)/src/libA.la \
        $(top_builddir)/deps/B/src/libB.la \
        $(top_builddir)/deps/C/libC.a

acc_test_SOURCES = test.cpp

走るacc_testと出会う

dyld: 遅延シンボル バインドに失敗しました: シンボルが見つかりません: __ZN7leveldb7OptionsC1Ev 参照元: /Users/somepath/build/src/.libs/libA.0.dylib

dyld: シンボルが見つかりません: __ZN7leveldb7OptionsC1Ev 参照元: /Users/somepath/cw/build/src/.libs/libA.0.dylib 予期される場所: flat 名前空間

これが私の主な問題です。

いろいろ試した結果、たどり着きました。

  • C内のライブラリのいくつかの関数を呼び出すとクラッシュしましたA。コードからコメントアウトしてもA、クラッシュしません。
  • ケース 1: をC明示的に使用してコードを記述してもtest.cpp、クラッシュしません。
  • ケース 2: を追加するAM_LDFLAGS = -staticと、クラッシュしません。
  • ケース 3: で同じ状況をシミュレートしようとしましたBが、クラッシュしません。

私の質問は以下のとおりです

  1. そもそもなぜクラッシュするのですか?動的ローディングについてだと思いますが、完全には理解していません。
  2. ケース 1 の場合、クラッシュしないのはなぜですか?
  3. ケース 2 の場合、クラッシュしないのはなぜですか?
  4. なしでこの問題を解決する他の方法はあります-staticか? ユーザーが私のライブラリを使用したいときにこれらのライブラリを静的にリンクする必要があるとしたら、それは奇妙だと思いますA
  5. ケース 3 の場合、クラッシュしないのはなぜですか? Blib の多くの実装がヘッダーにあることに気付きました。それは関係していますか?

ありがとうございました

4

0 に答える 0