在Qt项目中使用sem_t

时间:2010-05-24 19:19:29

标签: c++ qt qt4

我正在使用Qt(C ++)进行模拟,并希望使用我为sem_t类型创建的Semaphore包装器类。

虽然我在包装器类中包含了semaphore.h,但运行qmake会出现以下错误:

'sem_t未命名类型'

我相信这是一个库/链接错误,因为我可以从命令行编译类没有问题。

我已经读过你可以指定在编译期间包含的外部库。但是,我是a)不确定如何在项目文件中执行此操作,并且b)不确定要包含哪个库以访问semaphore.h。

非常感谢任何帮助。

谢谢,

汤姆

以下是参考包装类:

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 个答案:

答案 0 :(得分:2)

我能够使用qmake编译和链接您的信号量类,而没有任何意外的步骤(包括rtpthread库中的链接)。我创建了以下主要内容:

#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文件。您可能需要查看预处理的输出(gcc的-E标志)才能看到实际发生的情况。

注意:我建议您将信号量文件重命名为适用于不区分大小写的文件系统(例如Windows)的文件。

答案 1 :(得分:0)

为什么不使用Qt框架提供的信号量机制?我只是使用QSemaphores来保持在Qt生态系统中。

答案 2 :(得分:0)

QMake使用INCLUDEPATH添加外部包含路径 像INCLUDEPATH + = include_dir

您在文件中设置的INCLUDEPATH是什么?