在一个项目中,我noinst_PROGRAM
定义了两个 's。其中一个工作得很好,但另一个给我以下信息:
/home/altern8/workspaces/4355/libgdata/test/.libs/lt-gdatacalendar:符号查找错误:/home/altern8/workspaces/4355/libgdata/test/.libs/lt-gdatacalendar:未定义符号:_ZN5gdata7service7ServiceD1Ev
我一直在查看我的 Makefile.am 文件,但找不到任何我错过的东西。该应用程序编译正确,所以我猜这意味着正确找到了头文件,但由于某种原因我gdata::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/ 中内置的本地版本。
我将对此进行更多探索,也许下次再问一些其他问题。