构建Metakit时未定义的引用

时间:2012-04-02 13:37:37

标签: c++ linker

我正在尝试使用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

1 个答案:

答案 0 :(得分:1)

你说你在Windows上。这意味着这一行:

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

永远不应该被编译。这意味着#ifdef存在缺陷。

您有三种修复方法:

  1. 修复定义,以便不进行编译并进行预处理。

  2. 手动注释掉违规行。

  3. 尝试添加<fcntl.h>可能解决问题。假设您甚至拥有<fcntl.h>