Использование sem_t в проекте Qt - PullRequest
1 голос
/ 24 мая 2010

Я работаю над симуляцией в Qt (C ++) и хотел бы использовать класс-обёртку семафора, который я создал для типа sem_t.

Хотя я включаю semaphore.h в мой класс-оболочку, при запуске qmake выдается следующая ошибка:

'sem_t не называет тип'

Я считаю, что это ошибка библиотеки / компоновки, поскольку я могу без проблем скомпилировать класс из командной строки.

Я читал, что вы можете указать внешние библиотеки для включения во время компиляции. Однако я а) не уверен, как это сделать в файле проекта, и б) не уверен, какую библиотеку включить для доступа к semaphore.h.

Любая помощь будет принята с благодарностью.

Спасибо

Tom

Вот класс-оболочка для справки:

semaphore.h

#ifndef SEMAPHORE_H
#define SEMAPHORE_H

#include <semaphore.h>

class Semaphore {
public:
    Semaphore(int initialValue = 1);
    int getValue();
    void wait();
    void post();

private:
    sem_t mSemaphore;
};

#endif

Semaphore.cpp

#include "Semaphore.h"

Semaphore::Semaphore(int initialValue) {
    sem_init(&mSemaphore, 0, initialValue);
}

int Semaphore::getValue() {
    int value;
    sem_getvalue(&mSemaphore, &value);
    return value;
}

void Semaphore::wait() {
    sem_wait(&mSemaphore);
}

void Semaphore::post() {
    sem_post(&mSemaphore);
}

И, файл проекта QT:

TARGET = RestaurantSimulation
TEMPLATE = app
QT +=
SOURCES += main.cpp \
  RestaurantGUI.cpp \
  RestaurantSetup.cpp \
  WidgetManager.cpp \
  RestaurantView.cpp \
  Table.cpp \
  GUIFood.cpp \
  GUIItem.cpp \
  GUICustomer.cpp \
  GUIWaiter.cpp \
  Semaphore.cpp
HEADERS += RestaurantGUI.h \
  RestaurantSetup.h \
  WidgetManager.h \
  RestaurantView.h \
  Table.h \
  GUIFood.h \
  GUIItem.h \
  GUICustomer.h \
  GUIWaiter.h \
  Semaphore.h
FORMS += RestaurantSetup.ui
LIBS += 

Полный вывод компилятора:

g++ -c -pipe -g -gdwarf-2 -arch i386 -Wall -W -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -  
I/usr/local/Qt4.6/mkspecs/macx-g++ -I. - 
I/Library/Frameworks/QtCore.framework/Versions/4/Headers -I/usr/include/QtCore -
I/Library/Frameworks/QtGui.framework/Versions/4/Headers -I/usr/include/QtGui -
I/usr/include -I. -I. -F/Library/Frameworks -o main.o main.cpp

In file included from RestaurantGUI.h:10,
from main.cpp:2:
Semaphore.h:14: error: 'sem_t' does not name a type
make: *** [main.o] Error 1
make: Leaving directory `/Users/thauburger/Desktop/RestaurantSimulation'
Exited with code 2.
Error while building project RestaurantSimulation
When executing build step 'Make'

Ответы [ 3 ]

2 голосов
/ 24 мая 2010

Я смог скомпилировать и связать ваш класс семафоров, используя qmake без каких-либо неожиданных шагов (включая связывание в библиотеках rt или pthread). Я создал следующее главное:

#include "Semaphore.h"

int main(int argc, char* argv[])
{
        Semaphore sem;
        return 0;
}

И затем я сгенерировал следующий файл проекта, используя qmake -project:

######################################################################
# Automatically generated by qmake (2.01a) Mon May 24 12:50:02 2010
######################################################################

TEMPLATE = app
TARGET = 
DEPENDPATH += .
INCLUDEPATH += .

# Input
HEADERS += Semaphore.h
SOURCES += main.cpp Semaphore.cpp

Любая ошибка, которую вы видите, вызвана чем-то отличным от вашего Semaphore класса. Я бы порекомендовал внимательно посмотреть на ваш файл RestaurantGUI.h. Возможно, вам придется взглянуть на предварительно обработанный вывод (флаг -cc gcc), чтобы увидеть, что на самом деле происходит.

ПРИМЕЧАНИЕ: Я бы порекомендовал переименовать файлы семафоров во что-то, что будет работать в нечувствительных к регистру файловых системах, таких как Windows.

0 голосов
/ 24 мая 2010

QMake добавляет внешний путь включения, используя INCLUDEPATH
как INCLUDEPATH + = include_dir

Какое значение параметра INCLUDEPATH установлено в файле Pro?

0 голосов
/ 24 мая 2010

Почему вы не используете механизм семафоров, предоставляемый каркасом Qt? Я бы использовал QSemaphores только для того, чтобы оставаться в экосистеме Qt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...