所以我正在尝试使用boost来实现阻塞队列,但这件事无法编译......
template<class T>
class BlockingQueue {
private:
std::queue<T> blockedQueue;
boost::interprocess::interprocess_semaphore *counter;
public:
BlockingQueue(){
counter = new boost::interprocess::interprocess_semaphore(0);
}
virtual ~BlockingQueue(){
delete counter;
}
/**
* puts blockingly an element to the queue
*/
void put(T element) {
this->blockedQueue.push(element);
this->counter->post();
}
/**
* blocingly reads an element fromt he queue
*/
T* get(){
this->counter->wait();
T* result = &this->blockedQueue.front();
this->blockedQueue.pop();
return result;
}
};
然后出于测试目的,我只添加了我的主要功能
BlockingQueue<int>i;
i.get();
然而,当我尝试编译它时,我得到了以下错误:
./ src / Test.o:在功能上
boost::interprocess::ipcdetail::semaphore_init(sem_t*, unsigned int)': /usr/include/boost/interprocess/sync/posix/semaphore_wrapper.hpp:129: undefined reference to
sem_init'./src/Test.o:功能正常boost::interprocess::ipcdetail::semaphore_destroy(sem_t*)': /usr/include/boost/interprocess/sync/posix/semaphore_wrapper.hpp:140: undefined reference to
sem_destroy'./src/Test.o:在函数中boost::interprocess::ipcdetail::semaphore_wait(sem_t*)': /usr/include/boost/interprocess/sync/posix/semaphore_wrapper.hpp:156: undefined reference to
sem_wait'
用于编译我使用“g ++ -c -fmessage-length = 0 -std = c ++ 11 -pthread -lrt” 所以...我做错了什么?
答案 0 :(得分:1)
进程间库在documentation
中特别提到了这一点在POSIX系统中,Boost.Interprocess使用pthread系统调用 实现类,如互斥,条件变量等......在某些方面 在操作系统中,这些POSIX调用是分开实现的 未由编译器自动链接的库。对于 例如,在某些Linux系统中实现了POSIX pthread功能 在librt.a库中,因此您可能需要在链接时添加该库 使用Boost.Interprocess的可执行文件或共享库。如果你 请获取与那些pthread函数相关的链接错误 修改系统的文档以了解哪个库实现了 它们。
在Linux上,link with -pthread
.