Модератор: Модераторы разделов
zensou
Сообщения: 16
ОС: Ubuntu 9.04
Сообщение
zensou » 08.11.2008 18:47
Компилю проект под g++ & Code::Blocks, в логе выводится ошибка:
Код: Выделить всё
obj/Debug/LGE_Mutex.o||In function `LGE::Mutex::tryLock()':|
/home/zensou/Desktop/LGE/LGE_Mutex.cpp|54|undefined reference to `pthread_mutex_trylock'
54 - это строка
Код: Выделить всё
int result = pthread_mutex_trylock(&mMutex);
Что интересно, если закоментить эту строку, то весь код компилится без ошибок (там еще много ф-ий из <phread.h>, в т.ч. pthread_mutex_lock...).
Кто нибудь встречался с подобным?
mikluxo
Сообщения: 283
ОС: Slackware 12.2
Сообщение
mikluxo » 09.11.2008 01:33
А на сырец взглянуть не дадите?
Ich weiss, dass ich nichts weiss, aber wissen Sie es auch?
Завистники на что не взглянут,
подымут вечно лай,
А ты себе своей дорогою ступай,
Полают, да отстанут. Крылов
zensou
Сообщения: 16
ОС: Ubuntu 9.04
Сообщение
zensou » 09.11.2008 13:22
Исходник:
Код:
#include "LGE_Mutex.h"
namespace LGE
{
Mutex::Mutex(bool allowInit) throw()
{
if(allowInit)
{
try
{
initialize();
}
catch(const Exception & except)
{
throw copyException(except);
}
}
}
Mutex::~Mutex()
{
#if LGE_PLATFORM == LGE_LINUX
pthread_mutex_destroy(&mMutex);
#elif LGE_PLATFORM == LGE_WINDOWS
DeleteCriticalSection(&mMutex);
#endif
}
void Mutex::initialize() throw()
{
#if LGE_PLATFORM == LGE_LINUX
int result = pthread_mutex_init(&mMutex, 0);
if(result != 0)
throw initException("pthread_mutex_init() fail (code=%d)", result);
#elif LGE_PLATFORM == LGE_WINDOWS
InitializeCriticalSection(&mMutex);
#endif
}
void Mutex::lock() throw()
{
#if LGE_PLATFORM == LGE_LINUX
int result = pthread_mutex_lock(&mMutex);
if(result != 0)
throw initException("pthread_mutex_lock() fail (code=%d)", result);
#elif LGE_PLATFORM == LGE_WINDOWS
EnterCriticalSection(&mMutex);
#endif
}
bool Mutex::tryLock() throw()
{
#if LGE_PLATFORM == LGE_LINUX
int result = pthread_mutex_trylock(&mMutex);
if(result != 0 && result != EBUSY)
throw initException("pthread_mutex_trylock() fail (code=%d)", result);
return result == 0;
#elif LGE_PLATFORM == LGE_WINDOWS
return TryEnterCriticalSection(&mMutex) == TRUE;
#endif
}
void Mutex::unlock() throw()
{
#if LGE_PLATFORM == LGE_LINUX
int result = pthread_mutex_unlock(&mMutex);
if(result != 0)
throw initException("pthread_mutex_unlock() fail (code=%d)", result);
#elif LGE_PLATFORM == LGE_WINDOWS
LeaveCriticalSection(&mMutex);
#endif
}
}
Хидер:
Код:
#ifndef __LGE_MUTEX_H__
#define __LGE_MUTEX_H__
#include "LGE_Platform.h"
#include "LGE_Exception.h"
#if LGE_PLATFORM == LGE_LINUX
# include <sys/types.h>
# include <pthread.h>
# include <errno.h>
#elif LGE_PLATFORM == LGE_WINDOWS
# include <windows.h>
#endif
namespace LGE
{
class Mutex
{
private:
#if LGE_PLATFORM == LGE_LINUX
pthread_mutex_t mMutex;
#elif LGE_PLATFORM == LGE_WINDOWS
CRITICAL_SECTION mMutex;
#endif
public:
Mutex(bool allowInit = false) throw();
~Mutex();
void initialize() throw();
void lock() throw();
bool tryLock() throw();
void unlock() throw();
};
}
#endif //__LGE_MUTEX_H__
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64
Сообщение
AestheteAnimus » 09.11.2008 18:17
zensou писал(а): ↑ 08.11.2008 18:47
Компилю проект под g++ & Code::Blocks, в логе выводится ошибка...
Проверьте, стоит ли опция
-lpthread при линковке
zensou
Сообщения: 16
ОС: Ubuntu 9.04
Сообщение
zensou » 09.11.2008 19:50
AestheteAnimus , спс, действительно помогло
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64
Сообщение
AestheteAnimus » 09.11.2008 20:00
zensou писал(а): ↑ 09.11.2008 19:50
AestheteAnimus , спс, действительно помогло
Вот и замечательно