【问题标题】:gsoap undefined reference in linux qtlinux qt中的gsoap未定义引用
【发布时间】:2015-05-22 10:21:50
【问题描述】:

我正在尝试编译并运行我的第一个 gsoap。但是在我的 main() 中,我收到了 undefined reference to 错误。我在网上搜索,很多解决方案都是针对 Windows 的。我正在 Linux(CentOS) 中编程并使用 Qt ..

我的 .pro 文件是:

TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += main.cpp \
    stdsoap2.cpp \
    soapC.cpp \
    soapClient.cpp

HEADERS += \
    stdsoap2.h \
    soapStub.h \
    soapH.h \
    soapCountryInfoServiceSoapBindingProxy.h

我没有给出libgsoap++.a 的链接,因为我已经在我的项目中包含了stdsoap2。

错误信息是:

/.1/Projects/calisma/soapCountries/main.cpp:47: error: undefined reference to `__ns1__ListOfLanguagesByCode(soap*, _i__ListOfLanguagesByCode*, _i__ListOfLanguagesByCodeResponse*)'
:-1: error: collect2: ld returned 1 exit status

这是我的 main.cpp,我在__ns1__ListOfLanguagesByCode(soap, code, result); 行中遇到错误

main.cpp:

#include <iostream>
#include "CountryInfoServiceSoapBinding.nsmap"
#include "soapCountryInfoServiceSoapBindingProxy.h"

int main()
{
    CountryInfoServiceSoapBinding *countryObj;

    struct soap *soap = soap_new();

    countryObj = (CountryInfoServiceSoapBinding *)malloc(sizeof(CountryInfoServiceSoapBinding));

    if(countryObj == NULL)
    {
        std::cout << "Cannot allocate memory for countryobj";
        exit(EXIT_FAILURE);
    }

    _i__ListOfLanguagesByCode *code;

    code = (_i__ListOfLanguagesByCode *)malloc(sizeof(_i__ListOfLanguagesByCode));

    if(code == NULL)
    {
        std::cout << "Cannot Allocate Memory for code";
        exit(EXIT_FAILURE);
    }

    _i__ListOfLanguagesByCodeResponse *result;

    result = (_i__ListOfLanguagesByCodeResponse *)malloc(sizeof(_i__ListOfLanguagesByCodeResponse));

    if(result == NULL)
    {
        std::cout << "Cannot Allocate Memory for result";
        exit(EXIT_FAILURE);
    }

    code = (_i__ListOfLanguagesByCode *)("tur");

    __ns1__ListOfLanguagesByCode(soap, code, result);

    std::cout << "result = " << result << std::endl;

    return 0;
}

我无法弄清楚我的错误在哪里,或者我错过了哪一部分。基本上我想提供代码(在我的示例中是“tur”)并查看服务结果。

任何帮助将不胜感激。

编辑:这是项目中所有 cpp 和 .h 文件的列表..

mg@mg-CentOS soapCountries]$ ll
total 1408
-rw-rw-r-- 1 mg papilon    560 May 22 10:04 CountryInfoServiceSoapBinding.nsmap
-rw-rw-r-- 1 mg papilon   1220 May 22 13:00 main.cpp
-rw-rw-r-- 1 mg papilon   1135 May 22 13:21 main.cpp.autosave
-rw-rw-r-- 1 mg papilon 707557 May 22 10:04 soapC.cpp
-rw-rw-r-- 1 mg papilon  48024 May 22 10:04 soapClient.cpp
-rw-rw-r-- 1 mg papilon    373 May 22 10:04 soapClientLib.cpp
-rw-rw-r-- 1 mg papilon    252 May 22 12:58 soapCountries.pro
-rw-rw-r-- 1 mg papilon  17907 May 22 15:02 soapCountries.pro.user
-rw-rw-r-- 1 mg papilon   7148 May 22 12:01 soapCountryInfoServiceSoapBindingProxy.h
-rw-rw-r-- 1 mg papilon 151092 May 22 10:04 soapH.h
-rw-rw-r-- 1 mg papilon  39137 May 22 10:04 soapServer.cpp
-rw-rw-r-- 1 mg papilon    373 May 22 10:04 soapServerLib.cpp
-rw-rw-r-- 1 mg papilon  49034 May 22 10:04 soapStub.h
-rw-r--r-- 1 mg papilon 311882 Jun  6  2004 stdsoap2.cpp
-rw-r--r-- 1 mg papilon  56325 Jun  6  2004 stdsoap2.h

编辑 2:

int __ns1__ListOfLanguagesByCode的定义,它位于"soapCountryInfoServiceSoapBindingProxy.h"内部

virtual int __ns1__ListOfLanguagesByCode(_i__ListOfLanguagesByCode *i__ListOfLanguagesByCode, _i__ListOfLanguagesByCodeResponse *i__ListOfLanguagesByCodeResponse) { return soap ? soap_call___ns1__ListOfLanguagesByCode(soap, endpoint, NULL, i__ListOfLanguagesByCode, i__ListOfLanguagesByCodeResponse) : SOAP_EOM; }

【问题讨论】:

  • 你把gsoap生成的所有文件都加进去了吗?我认为它会生成更多文件(例如用于 bindingproxy 的 cpp 文件)。还可以找到在什么cpp文件中定义了__ns1__ListOfLanguagesByCode函数
  • @demonplus 请参阅编辑。我编写了项目中包含的所有 cpp 和 .h 文件
  • 你能在这些 cpp 文件中找到 __ns1__ListOfLanguagesByCode 函数吗?
  • @demonplus 是的,它位于soapCountryInfoServiceSoapBindingProxy.h 中。请参阅EDIT2 了解定义
  • @demonplus 是的,我发现它在生成的soapC.cpp 中,也包含在我的项目中

标签: c++ linux qt service gsoap


【解决方案1】:

我认为在您的 .pro 文件中需要添加以下字符串: LIBS += -lgsoap

【讨论】:

  • 我认为适用于 windows 的 lgsoap 库。但正如我告诉你的,我使用的是 linux。在我的 gsoap 文件夹中,我有 libgsoap++.a(我认为这与 windows 中的 lgsoap 相同)。但是在 .pro 文件中添加这个库并没有改变任何东西。另外,正如我从 gsoap 手册中了解到的那样,我不需要包含这个库,因为我已经在我的项目中添加了 stdsoap2.cpp 和 .h 文件。
  • 在 Windows 上,您也永远不会包含 gsoap。 gsoap 仅用于生成文件,然后包含文件
  • 可以尝试 #locate libgsoap++.a 或 #locate stdsoap2.a 并将此路径添加到您的 PATH 和 LD_LIBRARY_PATH 吗?
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 2012-04-16
相关资源
最近更新 更多