2

I am currently porting a c++ application developed in MS VS2005 to linux and unfortunately this is the first time I am doing this. We are using Qt 4.6, Opencascade 6.5.1 and Qwt 6.0.1. Most of the code compiles just fine but at one point we are trying to use X to determine the client screen size and as soon as I am trying to include X libraries i get a ton of errors. The class header contains the following lines:

#ifdef WNT
#include <windows.h>
#else
#include <X11/X.h>
#include <X11/Xlib.h>
#endif //WNT

When I have only the #include <X11/X.h> line I get the following errors:

In file included from v0000/plot_curve.h:7,
                 from v0000/utility.h:9,
                 from v0000/settings.h:16,
                 from v0000/dialog.cpp:10:
../../../qwt-6.0.1/include/qwt_symbol.h:35: error: expected identifier before numeric constant
../../../qwt-6.0.1/include/qwt_symbol.h:35: error: expected `}' before numeric constant
... <many more of these in this file>
In file included from v0000/plot_curve.h:7,
                 from v0000/utility.h:9,
                 from v0000/settings.h:16,
                 from v0000/dialog.cpp:10:
../../../qwt-6.0.1/include/qwt_symbol.h:10:1: unterminated #ifndef
In file included from v0000/utility.h:9,
                 from v0000/settings.h:16,
                 from v0000/dialog.cpp:10:
v0000/plot_curve.h:1:1: unterminated #ifndef
In file included from v0000/settings.h:16,
                 from v0000/dialog.cpp:10:
v0000/utility.h:1:1: unterminated #ifndef
In file included from v0000/dialog.cpp:10:
v0000/settings.h:1:1: unterminated #ifndef

and with the #include <X11/Xlib.h> line only:

In file included from ../../../../lib/inc/gce_MakeDir.hxx:20,
                 from v0000/bounding_box.cpp:17:
../../../../lib/inc/gce_Root.hxx:49: error: expected unqualified-id before ')' token
In file included from ../../../../lib/inc/gce_Root.hxx:71,
                 from ../../../../lib/inc/gce_MakeDir.hxx:20,
                 from v0000/bounding_box.cpp:17:
../../../../lib/inc/gce_Root.lxx:11: error: expected unqualified-id before "int"

The code we need X for is currently deactivated so without the two includes, everything compiles just fine.

I really can't seem to track down the root of the problem. The X include path is correct, sample applications of qt and occ work (so I guess they are using X and the installation should be ok) and I could not find an error with include guards.

//edit as requested, here is the source code of the files in which the errors occur:

qwt_symbol.h: (qwt)

/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
 * Qwt Widget Library
 * Copyright (C) 1997   Josef Wilgen
 * Copyright (C) 2002   Uwe Rathmann
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the Qwt License, Version 1.0
 *****************************************************************************/

#ifndef QWT_SYMBOL_H
#define QWT_SYMBOL_H

#include "qwt_global.h"
#include <QPolygonF>

class QPainter;
class QRect;
class QSize;
class QBrush;
class QPen;
class QColor;
class QPointF;

//! A class for drawing symbols
class QWT_EXPORT QwtSymbol
{
public:
    /*!
      Symbol Style
      \sa setStyle(), style()
     */
    enum Style
    {
        //! No Style. The symbol cannot be drawn.
        NoSymbol = -1,

        //! Ellipse or circle
        Ellipse,

        //! Rectangle
        Rect,

        //!  Diamond
        Diamond,

        //! Triangle pointing upwards
        Triangle,

        //! Triangle pointing downwards
        DTriangle,

        //! Triangle pointing upwards
        UTriangle,

        //! Triangle pointing left
        LTriangle,

        //! Triangle pointing right
        RTriangle,

        //! Cross (+)
        Cross,

        //! Diagonal cross (X)
        XCross,

        //! Horizontal line
        HLine,

        //! Vertical line
        VLine,

        //! X combined with +
        Star1,

        //! Six-pointed star
        Star2,

        //! Hexagon
        Hexagon,

        /*!
         Styles >= QwtSymbol::UserSymbol are reserved for derived
         classes of QwtSymbol that overload drawSymbols() with
         additional application specific symbol types.
         */
        UserStyle = 1000
    };

public:
    QwtSymbol( Style = NoSymbol );
    QwtSymbol( Style, const QBrush &, const QPen &, const QSize & );
    QwtSymbol( const QwtSymbol & );
    virtual ~QwtSymbol();

    QwtSymbol &operator=( const QwtSymbol & );
    bool operator==( const QwtSymbol & ) const;
    bool operator!=( const QwtSymbol & ) const;

    void setSize( const QSize & );
    void setSize( int width, int height = -1 );
    const QSize& size() const;

    virtual void setColor( const QColor & );

    void setBrush( const QBrush& b );
    const QBrush& brush() const;

    void setPen( const QPen & );
    const QPen& pen() const;

    void setStyle( Style );
    Style style() const;

    void drawSymbol( QPainter *, const QPointF & ) const;
    void drawSymbols( QPainter *, const QPolygonF & ) const;

    virtual QSize boundingSize() const;

protected:
    virtual void drawSymbols( QPainter *,
        const QPointF *, int numPoints ) const;

private:
    class PrivateData;
    PrivateData *d_data;
};

/*!
  \brief Draw the symbol at a specified position

  \param painter Painter
  \param pos Position of the symbol in screen coordinates
*/
inline void QwtSymbol::drawSymbol(
    QPainter *painter, const QPointF &pos ) const
{
    drawSymbols( painter, &pos, 1 );
}

/*!
  \brief Draw symbols at the specified points

  \param painter Painter
  \param points Positions of the symbols in screen coordinates
*/

inline void QwtSymbol::drawSymbols(
    QPainter *painter, const QPolygonF &points ) const
{
    drawSymbols( painter, points.data(), points.size() );
}

#endif

gce_root.hxx: (opencascade)

// This file is generated by WOK (CPPExt).
// Please do not edit this file; modify original file instead.
// The copyright and license terms as defined for the original file apply to 
// this header file considered to be the "object code" form of the original source.

#ifndef _gce_Root_HeaderFile
#define _gce_Root_HeaderFile

#ifndef _Standard_HeaderFile
#include <Standard.hxx>
#endif
#ifndef _Standard_Macro_HeaderFile
#include <Standard_Macro.hxx>
#endif

#ifndef _gce_ErrorType_HeaderFile
#include <gce_ErrorType.hxx>
#endif
#ifndef _Standard_Boolean_HeaderFile
#include <Standard_Boolean.hxx>
#endif


//! This class implements the common services for <br>
//!           all classes of gce which report error. <br>
class gce_Root  {
public:

  void* operator new(size_t,void* anAddress) 
  {
    return anAddress;
  }
  void* operator new(size_t size) 
  {
    return Standard::Allocate(size); 
  }
  void  operator delete(void *anAddress) 
  {
    if (anAddress) Standard::Free((Standard_Address&)anAddress); 
  }

  //! Returns true if the construction is successful. <br>
        Standard_Boolean IsDone() const;

//! Returns the status of the construction: <br>
//! -   gce_Done, if the construction is successful, or <br>
//! -   another value of the gce_ErrorType enumeration <br>
//!   indicating why the construction failed. <br>
        gce_ErrorType Status() const;





protected:



gce_ErrorType TheError;


private:





};


#include <gce_Root.lxx>



// other Inline functions and methods (like "C++: function call" methods)


#endif

gce_root.lxx: (opencascade)

// File:    gce_Root.cxx
// Created: Tue Sep 29 12:34:39 1992
// Author:  Remi GILET
//      <reg@sdsun2>

inline Standard_Boolean gce_Root::IsDone () const
{
  return TheError == gce_Done;
}

inline gce_ErrorType gce_Root::Status() const
{ 
  return TheError;
}
Bowdzone
  • 3,827
  • 11
  • 39
  • 52
  • I forgot to mention, the target system is RHEL5. – Bowdzone Mar 18 '14 at 10:12
  • You stated you need to include X, you stated that when you do, you get errors, but then you only provided the errors you get when you neglect to include its headers... you're not showing the errors you need help with. – mah Mar 18 '14 at 10:13
  • Sorry for my english. Without the two includes the code compiles. The first error block occurs when i include the X.h and the second one when I include the Xlib.h. I edit my post to clarify – Bowdzone Mar 18 '14 at 10:16
  • In that case, and assuming the second time you mean you've included both of these headers... you need to show the source lines the errors are complaining about. From that, someone may be able to suggest what additional header(s) you need to include. – mah Mar 18 '14 at 10:18
  • Perhaps you could show us line 35 of `qwt_symbol.h`? My guess is that some other evil header has defined a macro with the same name as something in that header; but without seeing the code, I can't do more than guess. – Mike Seymour Mar 18 '14 at 10:21
  • Can you comoile a fike that contains only two #include directives for X.h and Xlib.h and nothing else, using your regular compilation flags? – n. m. could be an AI Mar 18 '14 at 10:26
  • The source code of the files is now included in the post – Bowdzone Mar 18 '14 at 10:27
  • Yes a file containing only the two includes works fine with the command used before. – Bowdzone Mar 18 '14 at 10:40
  • You probably have a name clash with some of the macros #defined in the X headers. To resolve it, isolate X functionality you need in its own separate source file. – n. m. could be an AI Mar 18 '14 at 14:25

3 Answers3

9

With the following includes:

#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

I needed to undef a few definitions:

#undef Bool
#undef CursorShape
#undef Expose
#undef KeyPress
#undef KeyRelease
#undef FocusIn
#undef FocusOut
#undef FontChange
#undef None
#undef Status
#undef Unsorted

Of course add LIBS += -lX11 in your .pro file, and you are good to go!

Bob Van de Vijver
  • 2,224
  • 2
  • 14
  • 11
4

It does not help your include problem directly, but QT has a class for determining client screen size, called QDesktopWidget. So you could do something like that:

QDesktopWidget *desktop =  QApplication::desktop();
QRect geometry = desktop->availableGeometry();

Or one of the other functions of the class. It allows you to select from multiple screens and access the screen a widget is in.

MatthiasB
  • 1,759
  • 8
  • 18
1

Have you checked to make sure that Qt is not defining types that X11 requires, such as Bool?

Take a look at Compiler does not see QX11Info as this covers a common problem when including X11 with Qt.

You may need to undef more than just Bool.

Community
  • 1
  • 1
Damian Dixon
  • 889
  • 8
  • 21