我正在使用 vmware 的 Web应用程序 api来尝试简单地检索“ServiceContent”对象中的字段。vmware 论坛上有一个如何完成此操作的示例。那里包含的示例对我来说编译得很好,但是在运行简单示例时会出现段错误-特别是跟踪回到soap_serializeheader()函数(我相信这些是在stdsoap2.cpp中定义的)。我的问题是我不知道如何避免这种段错误并且不知道为什么会发生这种情况(因为我几乎逐字逐句地遵循示例). 我正在使用 OS X 工具链(gcc 版本 4.0.1(Apple Inc. build 5465))结合(gsoap 版本 2.7.16)。我尝试了 gsoap 2.8,但得到了相同的结果。以下是我过去到达现在所在位置的过程。
这些是我用来解析 wsdl 的命令:
wsdl2h -o vim25.h vimService.wsdl
解析完成后,我使用以下命令进行编译:
soapcpp2 -x -C -pvsp vim25.h -I/place/where/stlvector.h/is
这会生成文件 vspC.cpp、vspClient.cpp 和 vspVimBindingProxy.cpp。在内部,这些文件具有相同的函数前缀(即 ns1/ns2 等),因此我的调用与示例中的调用相同。
这是我用来编译 vspC.cpp 和 vspClient.cpp 的命令:
g++ -DWITH_COOKIES -DWITH_OPENSSL -c vspC.cpp
g++ -DWITH_COOKIES -DWITH_OPENSSL -c vspClient.cpp
这是我用来编译 stdsoap2.cpp 的命令(如果我不使用 -DWITH_NONAMESPACES 进行编译,我会在链接所有内容时收到关于未定义符号“_namepspaces”的错误):
g++ -DWITH_COOKIES -DWITH_OPENSSL -DWITH_NONAMESPACES -c stdsoap2.cpp
然后,我将所有内容与测试代码链接在一起(同样,这与示例几乎完全相同,只是进行了更改以正确引用我创建的文件):
g++ -DWITH_COOKIES -DWITH_OPENSSL vspC.o vcpClient.o stdsoap2.o testcase.cpp -lssl -lcrypto -o doesntwork
这编译正确,但当然无法运行。我在这个vmware 论坛帖子中读到了一个 OS X 用户,他也遇到了麻烦。看来gsoap指南说您不能使用 stdsoap2.cpp 的标头和故障序列化代码,您必须单独编译它们。OS X 帖子中的用户似乎已经这样做了,但是我不确定如何将它们合并到我的测试文件中(他创建了空的 env.h 文件,然后用soap2cpp编译它) - 如果我包含 envH.h我得到了关于与 vspH.h 命名冲突的文件。所以第二个问题是我如何使用soap2cpp正确编译所有存根,这样就不会有命名空间冲突(这是我似乎遇到的)。
我不会提供源代码,因为它显示在用户 stumpr的第一个vwmare 论坛链接上。我不相信问题出在源头上,而是我在使用 g++ 编译期间使用 wsdl2h、soap2cpp 或一些不正确的标志组合的方式。
感谢您查看,希望有人可以解决问题!
编辑我想我可能已经解决了这个问题 - 通过使用 64 位系统(以及一个具有更多内存的系统)。我尝试在 X.6 上使用 -m32 进行编译,但它无法做到(抱怨内存问题)。
希望有人会偶然发现这一点并很高兴知道答案。