我正在Linux上移植WIN32库。我能够编译我的库,没有错误。但是当我尝试链接时,它会产生以下链接错误
未定义对`setmode'的引用
我知道 setmode 函数是标准库函数,它位于 unistd.h 中,我提供参数 -lc ,同时链接到终奌站。
这是link,它更多地关注 setmode 。
对此有什么帮助吗?
答案 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框中,我必须安装包libbsd0
和libbsd-dev
:
sudo apt-get install libbsd0 libbsd-dev
之后,我能够编译以下程序:
#include <bsd/unistd.h>
int main(void) {
setmode(0);
return 0;
}
使用命令:
gcc hello.c -lbsd