仅使用MinGW GCC的未定义引用

时间:2014-01-15 15:46:53

标签: c windows mingw ld undefined-reference

在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");
                                           ^

2 个答案:

答案 0 :(得分:3)

由于您收到错误:

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编译器进行编译。

答案 1 :(得分: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检查对象文件,看看是否一切都是应该的。