Я собираю программу, используя gsoap с g ++ и qmake. После нескольких часов работы я получил эту ошибку от компилятора:
/usr/share/gsoap/import/ds.h:89:2: error: stray ‘@’ in program
@char* Id;
^
Взглянув на файлы в /usr/share/gsoap/import
Я вижу много @
S в этом:
часть wsse.h
:
/// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Reference of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":ReferenceType.
/// @brief This element defines a security token reference
/// Imported element _wsse__Reference from typemap WS/WS-typemap.dat.
typedef struct _wsse__Reference
{ @char* URI;
@char* ValueType;
} _wsse__Reference;
Я не могу понять, что это такое @
в коде, и я думаю, что нет такой вещи в C ++.
Есть какой-то парень, чтобы помочь ?! Благодарю.
РЕДАКТИРОВАТЬ:
В этом есть и другие странные вещи. Еще одна ошибка компиляции:
/usr/share/gsoap/import/ds.h:289: error: expected ';' at end of member declaration
char* /*base64*/ PgenCounter 1; ///< Required element.
^
Взглянув на исходный файл, в определениях структуры есть много таких вещей:
/// "http://www.w3.org/2000/09/xmldsig#":DSAKeyValueType is a complexType.
struct ds__DSAKeyValueType
{
/// Element G of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary.
char* /*base64*/ G 0; ///< Optional element.
/// Element Y of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary.
char* /*base64*/ Y 1; ///< Required element.
/// Element J of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary.
char* /*base64*/ J 0; ///< Optional element.
/// Element P of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary.
char* /*base64*/ P 1; ///< Required element.
/// Element Q of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary.
char* /*base64*/ Q 1; ///< Required element.
/// Element Seed of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary.
char* /*base64*/ Seed 1; ///< Required element.
/// Element PgenCounter of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary.
char* /*base64*/ PgenCounter 1; ///< Required element.
};
Я не знаю, как интерпретировать числа после имени свойства.
Как уже упоминалось в mpromonet, файлы в /usr/share/gsoup/import
лайк ds.h
а также wsse.h
не являются кодами C / C ++ и не должны компилироваться компилятором C / C ++. Это можно понять из комментария в их заголовках:
Сгенерировано с помощью: wsdl2h -cuxy -o ds.h -t WS / WS-typemap.dat WS / ds.xsd
Вместо этого они должны быть переданы инструменту, поставляемому с gsoap
называется soapcpp2
как это:
soapcpp2 -I/usr/share/gsoap/import /usr/share/gsoap/import/ds.h
Проблема была в том, что я уже собирал другой файл с именем onvif.h
с soapcpp2 и инструмент не может обрабатывать два файла вместе. Затем (опять же благодаря mpromonent) получается, что импорт второго файла, wsse.h
в оригинальном файле onvif.h
может решить проблему. Другими словами, добавив следующую строку в onvif.h
#import "wsse.h"
Поначалу мне кажется, что в Интернете не так много информации, но я нашел это руководство, которое очень полезно:
/usr/share/gsoap/import/ds.h
файл генерируется wsdl2h
, В комментариях вы должны увидеть что-то вроде:
Generated with:
wsdl2h -cuxy -o ds.h -t WS/WS-typemap.dat WS/ds.xsd
Это не включение C / C ++, оно должно обрабатываться инструментом gSOAP soapcpp2
:
soapcpp2 -I/usr/share/gsoap/import /usr/share/gsoap/import/ds.h
Это сгенерирует включаемые и исходные файлы, которые вы должны скомпилировать с вашим проектом.
Для того, чтобы использовать wsse Плагин, который вы должны добавить в файл, созданный с помощью wsdl2h:
#import "wsse.h"
Других решений пока нет …