私はautotool
環境にいます。
ライブラリを依存関係としてA
使用するライブラリを開発しています。B
C
- でビルド
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 の場合、クラッシュしないのはなぜですか?
- なしでこの問題を解決する他の方法はあります
-static
か? ユーザーが私のライブラリを使用したいときにこれらのライブラリを静的にリンクする必要があるとしたら、それは奇妙だと思いますA
- ケース 3 の場合、クラッシュしないのはなぜですか?
B
lib の多くの実装がヘッダーにあることに気付きました。それは関係していますか?
ありがとうございました