我正在使用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'
答案 0 :(得分:2)
我能够使用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
文件。您可能需要查看预处理的输出(gcc的-E标志)才能看到实际发生的情况。
注意:我建议您将信号量文件重命名为适用于不区分大小写的文件系统(例如Windows)的文件。
答案 1 :(得分:0)
为什么不使用Qt框架提供的信号量机制?我只是使用QSemaphores来保持在Qt生态系统中。
答案 2 :(得分:0)
QMake使用INCLUDEPATH添加外部包含路径 像INCLUDEPATH + = include_dir
您在文件中设置的INCLUDEPATH是什么?