c++ - 将 gSOAP 与 2 个不同的 wsdl 文件一起使用时出现链接器错误

标签 c++ gsoap

我在同一应用程序中使用 2 个单独的 wsdl 文件在 Linux 上使用 gSOAP 编写 C++ Web 服务客户端。我已经设法让事情只用一个 wsdl 文件工作,并且在阅读文档之后,经历了在两个文件上使用 wsdl2h 的过程:

    wsdl2h -o header.h wsdlfile1.wsdl wsdlfile2.wsdl

这很好用,所以我就这样做了

    soapcpp2 -i -I/usr/share/gsoap/import/ header.h

然后我按照指示在 typemap.dat 中进行了所有常见的命名空间修改。我现在发现我有两个 soapService1Proxy.cpp/h 和 soapService2Proxy.cpp/h 类型的 .cpp 和 .h 文件。这不是我所期望的,但无论如何,我在我的主要函数中包含了两个 header 并创建了每个 Proxy 类的实例,并以与我对一个 wsdl 文件所做的完全相同的方式使用。然后我编译

    g++ -DWITH_OPENSSL main.cpp soapC.cpp soapService1Proxy.cpp soapService2Proxy.cpp -lgsoapssl++ -lssl

返回错误

    /tmp/ccHNDAM4.o:(.data+0x0): multiple definition of `namespaces'
    /tmp/ccLJIHwV.o:(.data+0x0): first defined here
    collect2: ld returned 1 exit status

我知道“命名空间”指的是 .nsmap 文件中的数组(在本例中,每个 wsdl 都是相同的)。我只包含其中一个,因为如果我同时包含两者,编译器会提示多重定义。如果有人能告诉我我在这里做错了什么,我将不胜感激,因为我已尝试尽可能忠实地遵循指南和 gSOAP 文档,但根本无法解决此问题。

最佳答案

我从未使用过 SOAP,但我快速浏览了一下 this user guide .

section 7.1.4 中的最后一段表示 soapcpp2-n-p 选项有助于解决链接冲突。 section 19.35 的链接提供更多信息。看来您必须使用 -q 选项分别在每个文件上运行 wsdl2h 以便为每个文件提供 C++ namespace 。当您随后运行 soapcpp2 时,它将自动应用 -p,您所要做的就是提供 -n 以获得 namespaces 以您的 C++ 命名空间名称为前缀的数组,后跟下划线。

我还没有尝试过这些,但希望这足以 让你重新出发。

关于c++ - 将 gSOAP 与 2 个不同的 wsdl 文件一起使用时出现链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10220155/

相关文章:

OS.walk 的 C++ 替代方案

c++ - 在 C++ 中将 long long 转换为字节数组并返回

c++ - gsoap c 文件读取

c - 运行 gsoap 应用程序时出现段错误

c++ - Qt Creator - SFML 链接到控制台项目

c++ - 指针映射到指针 vector 的错误

c++ - 选择套接字和标准输入

c++ - C++ 的 Web 服务客户端库

c++ - gSoap 的 gSoapWinhttp 插件是否支持 linux

c++ - ONVIF:Profile S 需要哪些 wsdl 文件