qt — ошибка компиляции C ++, включая X11 / X.h X11 / Xlib.h

В настоящее время я портирую приложение на c ++, разработанное в MS VS2005, на Linux, и, к сожалению, я делаю это впервые. Мы используем Qt 4.6, Opencascade 6.5.1 и Qwt 6.0.1.
Большая часть кода компилируется просто отлично, но в какой-то момент мы пытаемся использовать X для определения размера экрана клиента, и как только я пытаюсь включить библиотеки X, я получаю массу ошибок. Заголовок класса содержит следующие строки:

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

Когда у меня есть только #include <X11/X.h> В строке я получаю следующие ошибки:

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

и с #include <X11/Xlib.h> только строка:

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"

Код, для которого нам нужен X, в настоящее время деактивирован, поэтому без двух включений все компилируется просто отлично.

Я действительно не могу отследить корень проблемы. Путь X include правильный, примеры приложений qt и occ работают (так что я думаю, что они используют X, и установка должна быть в порядке), и я не смог найти ошибку с включенными защитными устройствами.

//редактировать
по запросу, вот исходный код файлов, в которых происходят ошибки:

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: (открытый каскад)

// 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: (открытый каскад)

// 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;
}

1

Решение

Это не поможет вашей проблеме включения напрямую, но в QT есть класс для определения размера экрана клиента, который называется QDesktopWidget. Так что вы можете сделать что-то вроде этого:

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

Или одна из других функций класса. Это позволяет вам выбирать из нескольких экранов и получать доступ к экрану, в котором находится виджет.

4

Другие решения

Со следующим включает в себя:

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

Мне нужно было определить несколько определений:

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

Конечно добавить LIBS += -lX11 в вашем .pro файле, и вы готовы к работе!

4

Вы проверили, чтобы убедиться, что Qt не определяет типы, которые требуются X11, такие как Bool?

Взгляни на Компилятор не видит QX11Info поскольку это покрывает общую проблему при включении X11 с Qt.

Вам может понадобиться больше, чем просто Bool.

1
По вопросам рекламы [email protected]