Bonjour,

J'ai un petit problème pour compiler le programme qpdf avec le compilateur d'IBM xlC_r sur un serveur Aix.
Pour situer, qpdf (http://qpdf.sourceforge.net/) est un programme de manipulation de PDF, qui pourrait m'être utile pour faire des tests sur des PDF produits par une chaîne éditique.

Quand je compile sur Aix, j'ai le message suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
xlC_r -I/home/xxxx/include -I/home/xxxx/include  -Iinclude -c examples/pdf-mod-info.cc -o examples/build/pdf-mod-info.o
"examples/pdf-mod-info.cc", line 49.25: 1540-0218 (S) The call does not match any parameter list for "operator!=".
"/usr/vacpp/include/xtree", line 210.22: 1540-1283 (I) "std::_Tree<class std::_Tset_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,0> >::iterator::operator!=(const iterator &) const" is not a viable candidate.
"examples/pdf-mod-info.cc", line 49.28: 1540-0256 (I) A parameter of type "const std::_Tree<class std::_Tset_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator..." cannot be initialized with an expression of type "std::set<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,struct std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,class std::allocator<std::basic_string<...".
"/usr/vacpp/include/utility", line 81.14: 1540-1283 (I) "template <class _T1, class _T2> std::operator!=(const pair<_T1,_T2> &, const pair<_T1,_T2> &)" is not a viable candidate.
"/usr/vacpp/include/xutility", line 388.14: 1540-1283 (I) "template <class _RI> std::operator!=(const reverse_iterator<_RI> &, const reverse_iterator<_RI> &)" is not a viable candidate.
"/usr/vacpp/include/xutility", line 503.14: 1540-1283 (I) "template <class _E, class _Tr> std::operator!=(const istreambuf_iterator<_E,_Tr> &, const istreambuf_iterator<_E,_Tr> &)" is not a viable candidate.
"/usr/vacpp/include/xmemory", line 158.14: 1540-1283 (I) "template <class _Ty, class _U> std::operator!=(const allocator<_Ty> &, const allocator<_U> &)" is not a viable candidate.
"/usr/vacpp/include/string", line 114.14: 1540-1283 (I) "template <class _E, class _Tr, class _A> std::operator!=(const basic_string<_E,_Tr,_A> &, const basic_string<_E,_Tr,_A> &)" is not a viable candidate.
"/usr/vacpp/include/string", line 118.14: 1540-1283 (I) "template <class _E, class _Tr, class _A> std::operator!=(const _E *, const basic_string<_E,_Tr,_A> &)" is not a viable candidate.
"/usr/vacpp/include/string", line 122.14: 1540-1283 (I) "template <class _E, class _Tr, class _A> std::operator!=(const basic_string<_E,_Tr,_A> &, const _E *)" is not a viable candidate.
"/usr/vacpp/include/iterator", line 189.14: 1540-1283 (I) "template <class _Ty, class _E, class _Tr, class _Dist> std::operator!=(const istream_iterator<_Ty,_E,_Tr,_Dist> &, const istream_iterator<_Ty,_E,_Tr,_Dist> &)" is not a viable candidate.
"/usr/vacpp/include/xtree", line 442.14: 1540-1283 (I) "template <class _Tr> std::operator!=(const _Tree<_Tr> &, const _Tree<_Tr> &)" is not a viable candidate.
"/usr/vacpp/include/list", line 412.14: 1540-1283 (I) "template <class _Ty, class _A> std::operator!=(const list<_Ty,_A> &, const list<_Ty,_A> &)" is not a viable candidate.
"/usr/vacpp/include/vector", line 319.14: 1540-1283 (I) "template <class _Ty, class _A> std::operator!=(const vector<_Ty,_A> &, const vector<_Ty,_A> &)" is not a viable candidate.
Manifestement, le compilateur ne trouve pas la bonne méthode pour l'opérateur != . Pourtant, ce code compile parfaitement sous Linux, et a logiquement été testé par d'autres (ce n'est pas du code à moi développé dans mon coin).

Ci-dessous, une version du code source réduite au minimum (je pense inutile de mettre le source complet sur ce forum), qui provoque tout de même le bug, avec en gras le code problématique :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43


#include <qpdf/QPDF.hh>
#include <qpdf/QPDFWriter.hh>
#include <qpdf/QPDFObjectHandle.hh>
#include <qpdf/QUtil.hh>
#include <qpdf/QTC.hh>
#include <iostream>
#include <string.h>
#include <stdlib.h>

void dumpInfoDict(QPDF& pdf,
		  std::ostream& os = std::cout,
		  std::string const& sep = ":\t")
{
    QPDFObjectHandle trailer = pdf.getTrailer();
    if (trailer.hasKey("/Info"))
    {
	QPDFObjectHandle info = trailer.getKey("/Info");
	std::set<std::string> keys = info.getKeys();
	for (std::set<std::string>::const_iterator it = keys.begin();
	     keys.end() != it; ++it)
	{
	    QPDFObjectHandle elt = info.getKey(*it);
	    std::string val;
	    if (false) {}
	    else if (elt.isString())
	    {
		val = elt.getStringValue();
	    }
	    else if (elt.isName())
	    {
		val = elt.getName();
	    }
	    else // according to PDF Spec 1.5, shouldn't happen
	    {
		val = elt.unparseResolved();
	    }
	    os << it->substr(1) << sep << val << std::endl; // skip '/'
	}
    }
}
Est-ce que quelqu'un parmi vous aurait une petite idée de ce qui coince ?
Mes seules connaissances en STL remontent à des cours il y a 10 ans en école d'ingénieur : il y a peut être des erreurs évidentes qui ne me sautent pas au yeux.

J'ai tenté des include de <string>, <list>, <vector>, <set>, <map>, ajouté un "using namespace std;", mais sans succès. J'ai aussi modifé la syntaxe du code, mais ça ne compile pas mieux.

Pour info, le serveur est en Aix 5.2, et pour le compilo :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
/home/xxxx> lslpp -L  | grep xlC
  xlC.adt.include            6.0.0.0    C     F    C Set ++ Application
  xlC.aix50.rte              8.0.0.5    C     F    C Set ++ Runtime for AIX 5.0
  xlC.cpp                    5.0.2.0    C     F    C for AIX Preprocessor
  xlC.msg.en_US.cpp          5.0.2.0    C     F    C for AIX Preprocessor
  xlC.msg.en_US.rte          8.0.0.5    C     F    C Set ++ Runtime
  xlC.rte                    8.0.0.5    C     F    C Set ++ Runtime
/home/xxxx>
Peut être est-ce le compilateur qui gère mal certaines syntaxe ?

Pour info, j'ai voulu installer gcc/g++ sur cette machine, mais impossible de compiler certaines dépendances.

Merci d'avance