我最近从Windows 7迁移到了Linux(Ubuntu 14.04),并希望编译我制作的C程序。该程序使用GNU GCC编译器的基本设置在Codeblocks 12.11下完美运行。当使用GNU GCC编译器的基本设置在Codeblocks 13.12下在linux下编译时,我收到以下错误消息:
对__mingw_vprintf的未定义引用
对__chstk.ms的未定义引用
对_fopen的未定义引用
...以及fscanf
,malloc
等等......
我是Linux的新手,我不习惯C编码,甚至不习惯编程。有人知道发生了什么吗?
答案 0 :(得分:1)
这里有三个不同的问题。
(1)对于_fopen,微软有一个令人讨厌的习惯,即重命名所有POSIX函数,所以它们以下划线开头,而你的Linux发行版正在寻找标准的POSIX名称,即fopen。欢迎来到令人沮丧的跨平台开发世界:)。解决方案是在这些方面添加一些东西:
#ifdef __WIN32
#define fopen _fopen
#endif
这实际上说,如果在Windows机器上进行编译(通常将__WIN32定义为预处理器定义;如果不是,则可以始终确保它是),将fopen
的每次出现替换为{ {1}}。预处理器将为您完成此操作。
(2)对于__mingw_vprintf,我从未见过这个函数,但从名称我猜测它是一个特定于mingw的vprintf实现。我个人会重写我的代码以坚持使用标准C函数_fopen
。您可以阅读vprintf here的手册页;并且可以找到MSDN信息here。再次注意,许多Microsoft提供的函数都在名称前面加了下划线。您可以执行类似于上述情况(1)中所做的操作。
N.B。实际上,如果我要重写程序,我会使用C ++ IO流,但我坚持使用纯C答案。
(3)对于__chstk.ms,我再也没见过这个函数。我怀疑它是插入到代码中的东西,用于执行堆栈检查以帮助防止基于堆栈的攻击。据我所知,你无法在Linux机器上工作。