【问题标题】:Mingw compiling error on Linux with a program made on Windows使用在 Windows 上制作的程序在 Linux 上编译错误
【发布时间】:2014-07-27 23:42:29
【问题描述】:

我最近从 Windows 7 迁移到 Linux (Ubuntu 14.04) 并想编译我制作的 C 程序。该程序使用 GNU GCC 编译器的基本设置在 Codeblocks 12.11 下完美运行。在 linux 下使用 GNU GCC 编译器的基本设置在 Codeblocks 13.12 下编译时,我收到以下错误消息:

对 __mingw_vprintf 的未定义引用
未定义对 __chstk.ms 的引用
未定义的 _fopen 引用

... 以fscanfmalloc 等等...

我是 Linux 新手,我不习惯 C 编码,甚至一般的编程。有人知道发生了什么吗?

【问题讨论】:

  • 您的链接器有问题。也许你需要调整你的项目依赖(包含)列表。
  • 正如@FiddlingBits 所指出的,您缺少一些链接器依赖项。我不确定您是如何配置 C::B 的,但看起来您正在尝试使用 MinGW 编译器。您是否已将项目的编译器配置切换为使用平台的 GNU C 编译器而不是 MinGW 编译器?它可能是特定于项目的设置,而不是全局 C::B 设置,因为它仍在寻找 MinGW 的内容,并且您已从 Windows 迁移到 Linux。
  • 奇怪的是,您收到关于 __mingw_vprintf 的错误。您的程序是否专门调用此函数?或者您是否试图链接您在 Windows 下编译的目标文件或库? (与您应该做的相反,即完全重建所有二进制文件)

标签: c mingw codeblocks


【解决方案1】:

你在这里遇到了三个不同的问题。

(1) 对于 _fopen,Microsoft 有一个讨厌的习惯,即重命名所有 POSIX 函数,因此它们以下划线开头,而您的 Linux 发行版正在寻找标准 POSIX 名称,即 fopen。欢迎来到令人沮丧的跨平台开发世界:)。解决方案是添加以下内容:

#ifdef __WIN32
    #define fopen _fopen
#endif

这实际上是说,如果在 Windows 机器上编译(通常将 __WIN32 定义为预处理器定义;如果不是,您始终可以确保它是)将每次出现的 fopen 替换为 _fopen .预处理器将为您执行此操作。

(2) 对于 __mingw_vprintf,我从来没有见过这个函数,但从名字我推测它是一个特定于 mingw 的 vprintf 实现。我个人会重写我的代码以坚持使用标准 C 函数vprintf。您可以阅读 vprintf here 的手册页;可以在here找到MSDN信息。再次注意,许多 Microsoft 提供的函数名称前都带有下划线。您可以执行与上述情况 (1) 类似的操作。

注意实际上,如果我要重写程序,我会使用 C++ IO-streams,但我坚持使用纯 C 的答案。

(3) 对于 __chstk.ms,我还是没见过这个函数。我怀疑它是插入到您的代码中以执行堆栈检查以帮助防止基于堆栈的漏洞利用的东西。据我所知,你不可能让它在 Linux 机器上工作。

【讨论】:

  • 我没有投票的声望,我会尽可能地投票。非常感谢 ! :)
猜你喜欢
  • 1970-01-01
  • 2018-08-25
  • 2013-11-28
  • 2021-03-04
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多