1 つのプロジェクトで、2 つnoinst_PROGRAM
の が定義されています。そのうちの 1 つは問題なく動作しますが、もう 1 つは次のメッセージを表示しています。
/home/altern8/workspaces/4355/libgdata/test/.libs/lt-gdatacalendar: シンボル検索エラー: /home/altern8/workspaces/4355/libgdata/test/.libs/lt-gdatacalendar: 未定義のシンボル: _ZN5gdata7service7ServiceD1Ev
Makefile.am ファイルを調べましたが、見逃したものは見つかりません。アプリケーションは正しくコンパイルされるので、これはヘッダー ファイルが正しく検出されたことを意味すると推測していますが、何らかの理由で mygdata::service::Service
が src/libgdata.la ライブラリに含まれていません。
私の仮定が正しい可能性はありますか?src/libgdata.la ライブラリで定義されている他のクラスは使用できるようです。「make」の出力は、Service.cc ファイルが正しくコンパイルされていることを示しています...最終的なライブラリに含まれていることを確認するためにどこを参照すればよいですか?
編集:
これまでに提供された回答に基づいて、これをさらにデバッグすることができました。
デストラクタは Service.cc で定義されています。ヘッダー ファイルでデストラクタに本文を指定すると、すべて正常に動作します。
// In Service.h
~Service() {}
// In Service.cc
// Service::~Service() {}
デストラクタが「機能する」ようになったので、Service.cc で定義されている他のメソッドが見つからないことに遭遇しました。
@ephemient の方法を使用すると、これらのシンボルが実際にライブラリに含まれているように見えます。または、出力を間違って読んでいますか?
000000e0 T _ZN55gdata7service7Service22addCommonRequestHeaderERKSsS4_
000000a0 T _ZN55gdata7service7Service22addCommonRequestHeaderERKSsS4_b
./src/.libs/libgdata.a
000240d0 T _ZN55gdata7service7Service22addCommonRequestHeaderERKSsS4_
00024090 T _ZN55gdata7service7Service22addCommonRequestHeaderERKSsS4_b
000240d0 T _ZN55gdata7service7Service22addCommonRequestHeaderERKSsS4_
00024090 T _ZN55gdata7service7Service22addCommonRequestHeaderERKSsS4_b
./src/.libs/libgdata.so
00000080 T _ZN55gdata7service7Service22addCommonRequestHeaderERKSsS4_
00000070 T _ZN55gdata7service7Service22addCommonRequestHeaderERKSsS4_b
./src//gdata/service/libgdata__gdata_service_la-Service.o
000000e0 T _ZN55gdata7service7Service22addCommonRequestHeaderERKSsS4_
000000a0 T _ZN55gdata7service7Service22addCommonRequestHeaderERKSsS4_b
./src//gdata/service/.libs/libgdata__gdata_service.a
000000e0 T _ZN55gdata7service7Service22addCommonRequestHeaderERKSsS4_
000000a0 T _ZN55gdata7service7Service22addCommonRequestHeaderERKSsS4_b
./src//gdata/service/.libs/libgdata__gdata_service_la-Service.o
私の src/Makefile.am は次のようになります。
SUBDIRS = gdata
lib_LTLIBRARIES = libgdata.la
libgdata_la_SOURCES =
libgdata_la_LIBADD = \
gdata/client/libgdata_gdata_client.la \
gdata/data/libgdata_gdata_data.la \
gdata/data/youtube/libgdata_gdata_data_youtube.la \
gdata/util/libgdata_gdata_util.la \
gdata/service/libgdata_gdata_service.la \
gdata/service/calendar/libgdata_gdata_service_calendar.la
私の src/gdata/service/Makefile.am は次のようになります。
SUBDIRS = calendar
noinst_LTLIBRARIES = libgdata_gdata_service.la
libgdata_gdata_service_ladir = \
$(includedir)/gdata/service
libgdata_gdata_service_la_SOURCES = \
Service.cc
libgdata_gdata_service_la_HEADERS = \
Service.h
私の test/Makefile.am は次のようになります。
INCLUDES = -I$(top_srcdir)/src/ -I$(top_srcdir)/test/
LDADD = ../src/libgdata.la
TESTS = check_bare
noinst_PROGRAMS = gdatacalendar gdatayoutube $(TESTS)
check_bare_SOURCES = check_bare.cc
gdatacalendar_SOURCES = gdatacalendar.cc
gdatayoutube_SOURCES = gdatayoutube.cc
gdatayoutube は問題なく動作します。サービス( gdata/client/libgdata_gdata_client.la )の代わりにクライアントディレクトリのコードを使用するのは古いコードです...クライアントがサービスからセットアップされる方法に違いはありません。:-/
**編集#2:##
これがどのように起こったのかはわかりませんが、問題は見つかったと思います。テスト アプリは、src/.
私はこれをさらに調査し、別の機会に他の質問をするかもしれません。