Cygwin中出现未定义的WinMain引用问题

10

我正在尝试编译,但遇到了以下问题

$ gcc errlib.c -o errlib.o

/usr/lib/gcc/x86_64-pc-cygwin/4.8.2/../../../../lib/libcygwin.a(libcmain.o): In function `main':
/usr/src/debug/cygwin-1.7.30-1/winsup/cygwin/lib/libcmain.c:39: undefined reference to `WinMain'
/usr/src/debug/cygwin-1.7.30-1/winsup/cygwin/lib/libcmain.c:39:(.text.startup+0x7e): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `WinMain'
collect2: error: ld returned 1 exit status

有什么建议吗?这些文件之前经过了很好的测试,也可以正常生成代码,但现在我认为可能存在一些cygwin设置问题...我是在cygwin上的Windows 8上编译的。


2
"gcc errlib.c -o errlib.o" 这条命令很混乱(它会生成一个扩展名为 .o 的可执行文件)。正确的方式应该是 "gcc -c errlib.c",以生成目标文件 errlib.o; 或者是 "gcc errlib.c -o errlib.exe",以生成可执行文件。 - Zanna
1个回答

17

使用-c编译标志只生成目标文件。如果没有-c,它会尝试链接可执行文件,但链接器(自动调用的)会失败。


但是现在如果我执行 $ gcc addtcpc.c -o addtcpc -l sockwrap errlib gcc: 错误: 找不到文件或目录:errlib 然而,如果我列出清单 ls addtcpc.c errlib.c sockwrap.c errlib.h sockwrap.h errlib.o sockwrap.o - Fawad Nasim
@user3448716 那我不完全理解你的问题。如果你只需要从源文件生成目标文件(而不链接可执行文件),那么你需要使用“-c”选项。如果你需要编译多个源文件并在此之后自动链接可执行文件,那么你就不需要使用“-c”选项。请描述你的工作流程以及你想要实现什么。 - Paul
实际上,我有一个文件,比如说xyz.c,但是这个文件使用了其他两个文件abc.h、abc.c和def.h、def.c中定义的一些函数。当我执行gcc xyz.c -o xyz -l abc.h def.h时,它无法工作。 - Fawad Nasim
2
尝试使用 gcc xyz.c abc.c def.c 命令。请注意,其中一个 .c 文件中必须定义 main() 函数。-I 用于告诉编译器扫描哪些目录以寻找包含文件,而不是提供头文件名称。您应该在 xyz.c 中包含 #include "abc.h"#include "def.h", 并且编译 abc.cdef.c 。这就是 gcc xyz.c abc.c def.c 的作用。 - Paul
@Paul 如果我们使用 gcc xyz.c abc.c def.c 命令来编译程序,生成的可执行文件名将会是 a.exe。为了在执行时不产生混淆,或许我们也应该使用 -o 标记来指定输出文件名。 - Aritro Shome

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接