GNU - 对“setmode”的未定义引用

时间:2013-03-25 05:16:30

标签: c linux gnu porting

我正在Linux上移植WIN32库。我能够编译我的库,没有错误。但是当我尝试链接时,它会产生以下链接错误

  

未定义对`setmode'的引用

我知道 setmode 函数是标准库函数,它位于 unistd.h 中,我提供参数 -lc ,同时链接到终奌站。

这是link,它更多地关注 setmode

对此有什么帮助吗?

4 个答案:

答案 0 :(得分:3)

setmode不是标准库函数;这是一个libbsd函数。这与手册X来源的BSD派生系统上的情况完全相同。传递-lbsd参数以使链接器在Linux上找到它。

始终通过互联网信任您自己系统的手册页。

答案 1 :(得分:3)

我担心这些答案都是无稽之谈。来自Win32环境的程序使用两种可能的setmode函数之一:Microsoft _setmode函数documented in MSDN,或者称为setmode的Cygwin模仿。

这与BSD setmode无关。它是一个双参数函数,它将文件描述符设置为二进制或文本转换模式。

如果您的程序需要此功能,但您链接到LibBSD,程序可能会链接,但它不正确。

GNU C库没有提供用于操作FILE *流或描述符的文本或二进制模式的接口,如果确实如此,它将不会执行任何操作,因为这两种模式是相同的。 / p>

在Cygwin上需要Cygwin setmode函数的代码可能只是在Unix上没有做任何事情就可以了:所以就是说:

#ifdef __CYGWIN__
setmode(fileno(my_stdio_stream), O_BINARY);
#elif _WIN32
_setmode(_fileno(my_stdio_stream), _O_BINARY);
#else
/* nothing on systems with no text-vs-binary mode */
#endif

答案 2 :(得分:2)

我也遇到了这个问题;链接发生在make过程中,所以这将发生,没有业务处理c(像我)的人尝试使用cygwin或mingw。感谢Cairnarvon的回答,我了解到缺少必要的包含声明:

#include <io.h>

...在调用setmode函数的模块中(在我的例子中,我试图在Cygwin 64位上构建GDAL)。错误仍然存​​在,直到我看到these folks'回答并得知64位版本的Cygwin没有预先强调32位版本的方式。所以我手动完成了前置,并且make成功完成了[更多]。我希望这会有所帮助。

答案 3 :(得分:0)

您必须使用<bsd/unistd.h>标题(不是<unistd.h>)。

在我的Ubuntu框中,我必须安装包libbsd0libbsd-dev

sudo apt-get install libbsd0 libbsd-dev

之后,我能够编译以下程序:

#include <bsd/unistd.h>

int main(void) {
    setmode(0);
    return 0;
}

使用命令:

gcc hello.c -lbsd