为了熟悉使用WSF / C ++框架的稳定Web服务定义(包括服务器和客户端),我决定遵循快速入门指南(参见http://wso2.org/project/wsf/cpp/2.0)。 0 / docs / )。 我已经成功地从源代码和hello服务器编译和安装框架。 问题是当我尝试编译hello客户端。
请在下面findc ++代码(hello_cli.cpp)和编译输出。
#include <stdio.h> #include <ServiceClient.h> #include <OMElement.h> #include <iostream> #include <WSFault.h> /*I have replaced AxisFault.h by this file since the AxisFault does not exist anymore*/ #include <Environment.h> using namespace std; using namespace wso2wsf; int main(int argc, char *argv[]) { Environment::initialize("hello.log", AXIS2_LOG_LEVEL_TRACE); string end_point = "http://localhost:9090/axis2/services/hello"; ServiceClient sc(end_point); OMElement * payload = new OMElement("greet"); payload->setText("Test service!"); try { OMElement* response = sc.request(payload, ""); if (response) { cout << endl << "Response: " << response << endl; } } catch (AxisFault & e) { if (sc.getLastSOAPFault()) { cout << endl << "Fault: " << sc.getLastSOAPFault() << endl; } else { cout << endl << "Error: " << e << endl; } } delete payload; }
使用给定的编译命令行:
gcc -o hello_cli -I$WSFCPP_HOME/include/axis2-1.6.0/ -L$WSFCPP_HOME/lib -laxutil -laxis2_axiom -laxis2_parser -laxis2_engine -lpthread -laxis2_http_sender -laxis2_http_receiver -lwso2_wsf hello_cli.cpp -ldl -Wl,--rpath -Wl,$WSFCPP_HOME/lib
我得到这个错误:
hello_cli.cpp:19:27: fatal error: ServiceClient.h : No such file or directory
要解决这个问题,我还包括ServiceClient所在的目录:
gcc -o hello_cli -I$WSFCPP_HOME/include/ -I$WSFCPP_HOME/include/axis2-1.6.0/ -L$WSFCPP_HOME/lib -laxutil -laxis2_axiom -laxis2_parser -laxis2_engine -lpthread -laxis2_http_sender -laxis2_http_receiver -lwso2_wsf --verbose hello_cli.cpp -ldl -Wl,--rpath -Wl,$WSFCPP_HOME/lib
这导致以下错误(我只是提供一个示例):
hello_cli.cpp:(.text+0x23): undefined reference to `std::allocator<char>::allocator()' hello_cli.cpp:(.text+0x3b): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)' hello_cli.cpp:(.text+0x4f): undefined reference to `wso2wsf::Environment::initialize(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, axutil_log_levels)' hello_cli.cpp:(.text+0x5e): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()' hello_cli.cpp:(.text+0x6a): undefined reference to `std::allocator<char>::~allocator()' hello_cli.cpp:(.text+0x76): undefined reference to `std::allocator<char>::allocator()'
通过使用g ++而不是gcc(自从我操纵C ++对象以来似乎很自然),我得到了以下内容。
命令行:
g++ -o hello_cli -I$WSFCPP_HOME/include/ -I$WSFCPP_HOME/include/axis2-1.6.0/ -L$WSFCPP_HOME/lib -laxutil -laxis2_axiom -laxis2_parser -laxis2_engine -lpthread -laxis2_http_sender -laxis2_http_receiver -lwso2_wsf --verbose hello_cli.cpp -ldl -Wl,--rpath -Wl,$WSFCPP_HOME/lib
输出:
/tmp/cccyHkNn.o: In function `main':
hello_cli.cpp :(。text + 0x4f):未定义的引用wso2wsf::Environment::initialize(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, axutil_log_levels)' hello_cli.cpp:(.text+0xc0): undefined reference to
wso2wsf :: ServiceClient :: ServiceClient(std :: basic_string,std :: allocator>)'hello_cli.cpp :(。text + 0x109):未定义引用wso2wsf::OMElement::OMElement(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)' hello_cli.cpp:(.text+0x159): undefined reference to
wso2wsf :: OMElement :: setText(std :: basic_string,std :: allocator>)'hello_cli.cpp :(。text + 0x1ac):未定义引用wso2wsf::ServiceClient::request(wso2wsf::OMElement*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)' hello_cli.cpp:(.text+0x234): undefined reference to
wso2wsf :: ServiceClient ::〜ServiceClient()'hello_cli.cpp :(。 0x36b):未定义的引用wso2wsf::ServiceClient::getLastSOAPFault()' hello_cli.cpp:(.text+0x384): undefined reference to
wso2 wsf :: ServiceClient :: getLastSOAPFault()'hello_cli.cpp :(。text + 0x411):未定义的引用wso2wsf :: ServiceClient ::〜ServiceClient()'/tmp/cccyHkNn.o:(.gcc_except_table+ wso2wsf::ServiceClient::~ServiceClient()' /tmp/cccyHkNn.o:(.gcc_except_table+0xc4): undefined reference to
typeinfo为wso2wsf :: WSFault'
我的操作系统是Ubuntu 12.04.1 LTS(64bits)和g ++版本是4.6.3(Ubuntu / Linaro 4.6.3-1ubuntu5)
这个问题得到了马特的评论
只使用g ++来编译和链接C ++,并将你的库(-lfoo)放在源文件和目标文件之后