2012-04-02 2 views
1

Я пытаюсь использовать Metakit библиотеки последнее обновление, но я всегда получаю Undefined reference в этой части кода:Неопределенная ссылка при создании Metakit

bool c4_FileStrategy::DataOpen(const char *fname_, int mode_) { 
    d4_assert(!_file); 

#if q4_WIN32 && !q4_BORC && !q4_WINCE 
    int flags = _O_BINARY | _O_NOINHERIT | (mode_ > 0 ? _O_RDWR : _O_RDONLY); 
    int fd = - 1; 

    if (GetPlatformId() != VER_PLATFORM_WIN32_NT) 
    fd = _open(fname_, flags); 
    if (fd == - 1) { 
    WCHAR wName[MAX_PATH]; 
    MultiByteToWideChar(CP_UTF8, 0, fname_, - 1, wName, MAX_PATH); 
    fd = _wopen(wName, flags); 
    } 
    if (fd != - 1) 
    _cleanup = _file = _fdopen(fd, mode_ > 0 ? "r+b" : "rb"); 
#else 
    _cleanup = _file = fopen(fname_, mode_ > 0 ? "r+b" : "rb"); 
#if q4_UNIX 
    if (_file != 0) 
    fcntl(fileno(_file), F_SETFD, FD_CLOEXEC); 
#endif //q4_UNIX 
#endif //q4_WIN32 && !q4_BORC && !q4_WINCE 

странное дело (для меня), что я получить эту ошибку компоновщика в этой строке: fcntl(fileno(_file), F_SETFD, FD_CLOEXEC); witch используется только для Linux. Часть #el появляется серым цветом, поэтому я думал, что код никогда не компилируется, так почему же я получаю эту неопределенную ссылку?

Любые мысли?

PS: с моей нынешней старой версией у меня нет проблем (2.4.6).

редактировать: Я на Windows, и с помощью Tornado (unfornatelly)

редактировать 2: это как q4_UNIX является defiend:

#if defined (__MINGW32__) 
#define d4_OS_H "win.h" 
#elif defined (MSDOS) && defined (__GNUC__) 
#define q4_DOS 1 
#elif defined(unix) || defined(__unix__) || defined(__GNUC__) || \ 
defined(_AIX) || defined(__hpux) 
#define q4_UNIX 1 
#elif defined (__VMS) 
#define q4_VMS 1 
#elif defined (macintosh) 
#define q4_MAC 1 
#elif !defined (d4_OS_H) 
#define d4_OS_H "win.h" 
#endif 
+0

На какой платформе вы являетесь? – orlp

+0

Я нахожусь на Windows – Kobe

ответ

1

Вы говорите, что вы на Windows. Это означает, что эта строка:

fcntl(fileno(_file), F_SETFD, FD_CLOEXEC); 

не должно быть скомпилировано. Это означает, что #ifdef имеет недостатки.

У вас есть три варианта крепления:

  1. Закрепить Определяет, так что это получить не компилируется и получает препроцессором из вместо.

  2. Прокомментируйте нарушающие линии вручную.

  3. Попробуйте включить <fcntl.h>, что могло бы исправить проблему. Это предполагает, что у вас даже есть <fcntl.h>.

+0

# 3: этот заголовок включен для q4_UNIX, и я также попытался включить его в #define. # 2: Я не могу прокомментировать их, потому что я думаю, что мне тоже нужно для linux (позже) # 1: как я могу их исправить? Старая версия, похоже, такая же, и у меня нет никаких проблем ... – Kobe

+0

@vBx: как определяется q4_UNIX? – orlp

+0

В старой библиотеке это было так: #define q4_UNIX 1, в этом новом Visual Studio говорит, что это не определено: -/ – Kobe

Смежные вопросы