Чтобы ознакомиться с определением спокойного веб-сервиса (как сервера, так и клиента) с использованием инфраструктуры WSF / C ++, я решил следовать краткому руководству по началу работы (см. http://wso2.org/project/wsf/cpp/2.0.0/docs/). Я успешно скомпилировал и установил фреймворк из исходников, а также с сервера hello.
Проблема в том, когда я пытаюсь скомпилировать привет клиент.
Ниже приведен код c ++ (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)'
wso2wsf :: ServiceClient :: ServiceClient (std :: basic_string, std :: allocator>) ‘
hello_cli.cpp:(.text+0xc0): undefined reference to
hello_cli.cpp :(. text + 0x109): неопределенная ссылка на wso2wsf::OMElement::OMElement(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
wso2wsf :: OMElement :: setText (std :: basic_string, std :: allocator>) ‘
hello_cli.cpp:(.text+0x159): undefined reference to
hello_cli.cpp :(. text + 0x1ac): неопределенная ссылка на wso2wsf::ServiceClient::request(wso2wsf::OMElement*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
wso2wsf :: ServiceClient :: ~ ServiceClient ()»
hello_cli.cpp:(.text+0x234): undefined reference to
hello_cli.cpp :(. text + 0x36b): неопределенная ссылка на wso2wsf::ServiceClient::getLastSOAPFault()'
wso2wsf :: ServiceClient :: getLastSOAPFault ()»
hello_cli.cpp:(.text+0x384): undefined reference to
hello_cli.cpp :(. text + 0x411): неопределенная ссылка на wso2wsf::ServiceClient::~ServiceClient()'
typeinfo для wso2wsf :: WSFault ‘
/tmp/cccyHkNn.o:(.gcc_except_table+0xc4): undefined reference to
Моя ОС — Ubuntu 12.04.1 LTS (64 бит), а версия g ++ — 4.6.3 (Ubuntu / Linaro 4.6.3-1ubuntu5).
Проблема исправлена благодаря комментарию Мата
Используйте только g ++ для компиляции и связывания C ++, и поместите ваши библиотеки (-lfoo) после ваших исходных и объектных файлов
Других решений пока нет …