【问题标题】:gsoap++ linking errorgsoap++ 链接错误
【发布时间】:2011-06-14 23:29:41
【问题描述】:

我用 gsoap++ 库编写了一个肥皂客户端。一旦我将这个编译为独立的测试应用程序,它就编译得很好,但是当我尝试编译这些类(包括在我的项目中)时,我得到了很多链接错误:

../common/UserGausClient/UserGausClient.o: In function `GAUS::SSLInit()':
/home/milo/src/pinmoney/src/registrator/../common/UserGausClient/UserGausClient.h:11: undefined reference to `soap_ssl_init'
../common/UserGausClient/soapC.o: In function `soap_faultdetail':
/home/milo/src/pinmoney/src/registrator/../common/UserGausClient/soapC.cpp:117: undefined reference to `soap_malloc'
../common/UserGausClient/soapC.o: In function `soap_getelement':
/home/milo/src/pinmoney/src/registrator/../common/UserGausClient/soapC.cpp:152: undefined reference to `soap_peek_element'
/home/milo/src/pinmoney/src/registrator/../common/UserGausClient/soapC.cpp:154: undefined reference to `soap_lookup_type'
/home/milo/src/pinmoney/src/registrator/../common/UserGausClient/soapC.cpp:155: undefined reference to `soap_lookup_type'
/home/milo/src/pinmoney/src/registrator/../common/UserGausClient/soapC.cpp:215: undefined reference to `soap_match_tag'
/home/milo/src/pinmoney/src/registrator/../common/UserGausClient/soapC.cpp:219: undefined reference to `soap_match_tag'
/home/milo/src/pinmoney/src/registrator/../common/UserGausClient/soapC.cpp:223: undefined reference to `soap_match_tag'
/home/milo/src/pinmoney/src/registrator/../common/UserGausClient/soapC.cpp:227: undefined reference to `soap_match_tag'
/home/milo/src/pinmoney/src/registrator/../common/UserGausClient/soapC.cpp:231: undefined reference to `soap_match_tag'
../common/UserGausClient/soapC.o:/home/milo/src/pinmoney/src/registrator/../common/UserGausClient/soapC.cpp:235: more undefined references to `soap_match_tag' follow
../common/UserGausClient/soapC.o: In function `soap_ignore_element(soap*)':
/home/milo/src/pinmoney/src/registrator/../common/UserGausClient/soapC.cpp:333: undefined reference to `soap_peek_element'
/home/milo/src/pinmoney/src/registrator/../common/UserGausClient/soapC.cpp:337: undefined reference to `soap_match_tag'
/home/milo/src/pinmoney/src/registrator/../common/UserGausClient/soapC.cpp:354: undefined reference to `soap_element_end_in'
../common/UserGausClient/soapC.o: In function `soap_class_id_enter(soap*, char const*, void*, int, unsigned int, char const*, char const*)':

等等。在 Codeblocks 中,它的链接被罚款......这是我的 Makefile:

CC=g++
RM=rm
CFLAGS=-c -g -Wall -DWITH_OPENSSL
LDFLAGS=-lpcrecpp -lpq -lcryptopp -lprotobuf -lrt -lgsoapssl++ -lssl -lcrypto -L/usr/lib/ -L/usr/local/lib/ -lgsoap

SOURCES=../common/PgConnectionManager.cpp \
    ../common/RSADecryptor.cpp \
    ../common/RSAEncryptor.cpp \
    ../common/RSAKeyGenerator.cpp \
    ../common/RSAKeyLoaderBase.cpp \
    ../common/RSAManager.cpp \
    ../common/TcpServer.cpp \
    ../common/UserGausClient/UserGausClient.cpp \
    ../common/UserGausClient/soapC.cpp \
    ../common/UserGausClient/soapuserBindingProxy.cpp \
    ../proto/BalanceHistory.pb.cc \
    ../proto/Bio.pb.cc \
    ../proto/ClientRegistration.pb.cc \
    ../proto/EmployeePermissions.pb.cc \
    ../proto/OperatorAuthentication.pb.cc \
    ../proto/Passport.pb.cc \
    ../proto/Ping.pb.cc \
    ../proto/SearchForBill.pb.cc \
    ../proto/UpdateClientData.pb.cc \
    RequestDispatcher.cpp \
    SQLStorage.cpp \
    SessionManager.cpp \
    main.cpp \


OBJECTS_SEARCHER=$(SOURCES:.cpp=.o)
OBJECTS=$(OBJECTS_SEARCHER:.cc=.o)

SEARCHER=registrator
INCLUDE=-I ../ 

all: $(SEARCHER) 

$(SEARCHER): $(OBJECTS)
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@
clean:
    $(RM) -f $(OBJECTS)

.cpp.o:
    $(CC) $(CFLAGS) $(INCLUDE) $< -o $@

我链接了所有必要的库 (-lgsoapssl++ -lssl -lcrypto),并检查了这些库中的请求函数:

$ nm /usr/lib/libgsoapssl++.a | grep soap_begin_count
00018da0 T soap_begin_count

图书馆里有。那么,有什么问题吗?

【问题讨论】:

    标签: linux gsoap


    【解决方案1】:

    我相信您必须在您的 make 中编译 gSoap 的 stdsoap2.* 文件之一。生成的soapC文件依赖于核心gSoap代码。

    【讨论】:

    • 好主意,但locate stdsoap* 没有找到任何东西... :(
    • 它带有 gSoap。我在你的 make 中没有看到 gSoap 的路径。
    • 您不需要 stdsoap2 是否链接到 gsoap 库,就像您在示例中所做的那样:代码编译并与 soapcalcProxy.cpp、soapC.cpp 和 stdsoap2.cpp 链接(或使用 libgsoap++.a)。
    • 我的测试应用程序很好地使用了这些类链接。有什么区别?
    • 我复制了 /usr/include/gsoap/stdsoap2.cpp,一切正常!谢谢你!但唯一的问题 - 当库存在时,目标文件中的符号怎么可能无法解析?
    【解决方案2】:

    一个可能的原因是为链接器指定库的顺序,一些链接器要求包含函数定义的库出现在需要它的对象或库之后。尝试重新安排库定义,以便在此处出现这种情况,并检查您的链接器文档以查看它是否需要。

    【讨论】:

      【解决方案3】:

      'stdsoap2.cpp' 需要来自 gsoap 源目录。

      PATH_TO_GSOAP_BUILD/gsoap-2.8/gsoap/stdsoap2.cpp(假设为 gsoap-2.8)

      【讨论】:

      • 我已经找到了,谢谢。此文件必须是项目的一部分才能成功链接。
      • 对上述解决方案的一些疑惑,我们需要在哪里复制stdsoap2.cpp文件?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-12
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多