我正在尝试使用Metakit库最新更新,但我总是在这段代码中获得Undefined reference
:
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);
只用于Linux。 #else部分显示为灰色,所以我认为代码永远不会编译,那么为什么我会得到这个未定义的引用呢?
有什么想法吗?
PS:使用我当前的旧版本,我没有问题(2.4.6)。
编辑:我在Windows上并使用Tornado(unfornatelly)
编辑2:这就是q4_UNIX的定义方式:
#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 :(得分:1)
你说你在Windows上。这意味着这一行:
fcntl(fileno(_file), F_SETFD, FD_CLOEXEC);
永远不应该被编译。这意味着#ifdef
存在缺陷。
您有三种修复方法:
修复定义,以便不进行编译并进行预处理。
手动注释掉违规行。
尝试添加<fcntl.h>
,可能解决问题。假设您甚至拥有<fcntl.h>
。