2012-04-02 14 views
1

Ich versuche, das Metakit Bibliothek neueste Update zu verwenden, aber ich habe immer ein Undefined reference in diesem Stück Code erhalten:undefinierte Referenz beim Bau 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 

Das Merkwürdige (für mich) ist, dass ich Holen Sie sich diesen Linker Fehler in dieser Zeile: fcntl(fileno(_file), F_SETFD, FD_CLOEXEC); Hexe wird nur für Linux verwendet. Der #else-Teil erscheint in grau, so dass ich dachte, dass Code niemals kompiliert wird. Warum bekomme ich dann diese undefinierte Referenz?

Irgendwelche Gedanken?

PS: mit meiner aktuellen älteren Version habe ich kein Problem (2.4.6).

edit: Ich bin auf Windows und mit Tornado (unfornatelly)

bearbeiten 2: So q4_UNIX defiend ist:

#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

Auf welcher Plattform befinden Sie sich? – orlp

+0

Ich bin unter Windows – Kobe

Antwort

1

Sie sagen, Sie sind unter Windows. Dies bedeutet, dass diese Zeile:

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

sollte nie kompiliert worden sein. Dies bedeutet, dass die #ifdef fehlerhaft sind.

Sie haben drei Möglichkeiten zur Befestigung:

  1. die definiert Fix, so dass diese nicht kompiliert bekommt und stattdessen vorverarbeitet heraus bekommt.

  2. Die fehlerhaften Zeilen manuell auskommentieren.

  3. Versuchen Sie, einschließlich <fcntl.h>, die könnte das Problem beheben. Nehmen wir an, Sie haben sogar <fcntl.h>.

+0

# 3: Dieser Header ist für q4_UNIX enthalten und ich habe auch versucht, außerhalb der #define enthalten. # 2: Ich kann sie nicht kommentieren, weil ich glaube, dass ich auch für Linux brauche (später) # 1: wie kann ich sie beheben? Die ältere Version scheint die gleiche zu sein und ich bekomme dort kein Problem ... – Kobe

+0

@vBx: Wie ist q4_UNIX definiert? – orlp

+0

In der alten Bibliothek war es wie folgt: #define q4_UNIX 1, in diesem neuen, sagt Visual Studio, dass nicht definiert ist: -/ – Kobe

Verwandte Themen