【问题标题】:Undefined references only using MinGW GCC仅使用 MinGW GCC 的未定义引用
【发布时间】:2014-02-04 04:27:01
【问题描述】:

在 Ubuntu 12.04.3 中编译代码一段时间后,我决定尝试在 Windows 中进行编码并安装 MinGW。安装后,我设置了路径变量,gcc 似乎可以工作。但是,某些代码(尤其是包含多个文件的代码)无法使用在 Ubuntu 上使用的相同命令进行编译,并且 MinGW shell 中会显示各种错误消息。这是预期的行为还是我做错了什么?感谢您的帮助。

P.S: 显示错误信息

 QROMO.C: In function 'float qromo(float (*)(float), float, float, float (*)(float (*)(float), float, float, int))':
QROMO.C:24:43: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
  nrerror("Too many steps in routing qromo");
                                           ^
C:\Users\dell\AppData\Local\Temp\ccUdzH1p.o:Q2.c:(.text+0xd5): undefined reference to `midexp'
C:\Users\dell\AppData\Local\Temp\ccUdzH1p.o:Q2.c:(.text+0xf3): undefined reference to `qromo'
C:\Users\dell\AppData\Local\Temp\ccUdzH1p.o:Q2.c:(.text+0x115): undefined reference to `qgaus'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: C:\Users\dell\AppData\Local\Temp\ccUdzH1p.o: bad reloc address 0x20 in section `.eh_frame'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status

编辑:错误似乎与编译阶段的 QROMO.c 和 POLINT.c 有关。收到的错误信息如下:

POLINT.C: In function 'void polint(float*, float*, int, float, float*, float*)':
POLINT.C:28:62: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
    if ( (den=ho-hp) == 0.0) nrerror("Error in routine polint");
                                                              ^


QROMO.C: In function 'float qromo(float (*)(float), float, float, float (*)(float (*)(float), float, float, int))':
QROMO.C:24:43: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
  nrerror("Too many steps in routing qromo");
                                           ^

【问题讨论】:

  • 请弄清楚如何从 cmd.exe 窗口复制文本(是的,有可能,是的,这很痛苦)或使用 > log.txt 2>&1 重定向输出并将其发布到 Stackoverflow。您仍然可以更新您的问题。
  • @rubenvb 做对了也不算痛苦,不能作为借口。
  • @glglgl 这很痛苦,因为在 cmd 窗口中,行被剪切的地方,而不是换行符的地方。
  • @rubenvb 哦,是的,没错,唉。我想知道为什么他们会创造出如此无用的东西……尽管如此,它是可以使用的,因此不能作为借口。
  • 我按照指示将输出重定向到文件并从那里进行复制粘贴操作。如果可能的话,我还想知道为什么该命令需要两个 >。

标签: c windows mingw ld undefined-reference


【解决方案1】:

由于您收到错误消息:

warning: deprecated conversion from string constant to 'char*'

我猜你正在使用 C++ 编译器作为 C++11 弃用从字符串常量到 'char*' 的转换进行编译。

§ C.1.1
char* p = "abc"; // valid in C, invalid in C++

如果您使用 C 编译器进行编译,则不会出现此错误,因为此转换在 C 中仍然有效。

如果您的程序与 C++ 不兼容,使用 C++ 编译器进行编译会产生很多错误。

所以请确保使用 C 编译器进行编译。

【讨论】:

  • 感谢您的回答。当扩展名以大写形式提供时,GCC 是否将文件解释为 C++?另外是否可以通过提供标志来明确选择编译模式?
  • @Vesnog 我认为这就是问题所在。尝试将扩展名更改为小写,然后重试。并尝试使用gcc -std=gnu11 -Wall ... 进行编译
  • @Vesnog 如果您想强制 gcc 将您的文件编译为 C 程序,请检查此stackoverflow.com/a/4216290/2727656
  • 当我使用选项 -std=gnu11 时,我注意到它尝试将文件编译为 C++,尽管它们是纯 C。我还注意到文件扩展名是大写的,我替换了这些扩展名用小写的c,解决方案就解决了。
  • 有关 GCC 如何使用文件扩展名来推断它应该如何处理文件的信息,请参阅gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/…
【解决方案2】:

重要的是底部的错误:

Q2.c(...): undefined reference to `midexp'
Q2.c(...): undefined reference to `qromo'
Q2.c(...): undefined reference to `qgaus'
...
...ld.exe: final link failed: Invalid operation
...

这意味着您有未定义的引用,并且与 MinGW 或 Windows 7 无关。

我假设这些是在它们各自的源文件中定义的,这些源文件以看似正确的顺序包含在您的编译/链接行中。我建议拆分编译和链接步骤,看看哪里出错了。这会将现在具有随机生成名称的临时目标文件转换为您知道的目标文件,因为您创建了它们。您可以使用nm 检查目标文件,看看是否一切正常。

【讨论】:

  • 由于我来自 Linux,我从未单独完成编译和链接步骤,但我确信指定的 GCC 命令在 Ubuntu 中可以完美运行。
  • @Vesnog 来自 Linux 没有理由不按照我在回答中所说的那样去做。它将追踪手头的问题。
  • 原来是QROMO.c文件的编译出错。
  • @rubenvb 我认为重要的部分是转换警告:)
  • rullof:我没想到。名称篡改。我需要清洁我的水晶球;-)
猜你喜欢
  • 1970-01-01
  • 2013-08-30
  • 2020-06-27
  • 2016-10-06
  • 2021-11-18
  • 2021-04-02
  • 2014-04-21
  • 2012-12-12
  • 2016-01-09
相关资源
最近更新 更多