【发布时间】:2014-04-04 01:29:15
【问题描述】:
我无法将 stdio 与虚拟功能结合使用(Windows Vista、Cygwin、GCC 4.8.2)
#include <stdio.h>
class A
{
public:
// If I make g() as virtual, stdio doesn't print.
virtual void g() {}
};
int main()
{
A a; // Or I could remove this object to make stdio print.
printf("testing\n");
}
在“Borgleader”的提示下,我发现它在与“-O2”选项一起使用时有效。使用/不使用“-O2”时,链接似乎有所不同。
/home/user> g++ test.cc
/home/user> ./a.exe
/home/user> ldd ./a.exe
ntdll.dll => /cygdrive/c/Windows/system32/ntdll.dll (0x77540000)
kernel32.dll => /cygdrive/c/Windows/system32/kernel32.dll (0x75790000)
cygwin1.dll => /usr/bin/cygwin1.dll (0x61000000)
cyggcc_s-1.dll => /usr/bin/cyggcc_s-1.dll (0x6bf40000)
cygstdc++-6.dll => /usr/bin/cygstdc++-6.dll (0x6c480000)
/home/user> g++ -O2 test.cc
/home/user> ./a.exe
testing
/home/user> ldd ./a.exe
ntdll.dll => /cygdrive/c/Windows/system32/ntdll.dll (0x77540000)
kernel32.dll => /cygdrive/c/Windows/system32/kernel32.dll (0x75790000)
cygwin1.dll => /usr/bin/cygwin1.dll (0x61000000)
感谢 selbie 建议尝试 GDB。现在事情有点清楚了。我应该忘记 printf,程序甚至没有加载!使用选项“-O2”,它可以正常工作(即使在 GDB 中)。
/home/user> g++ -g test.cc
/home/user> gdb ./a.exe
<<Edited for brevity>>
(gdb) break main
Breakpoint 1 at 0x40119e: file test.cc, line 14.
(gdb) run
Starting program: /home/user/a.exe
[New Thread 4888.0x13e0]
gdb: unknown target exception 0xc0000139 at 0x77549cfc
During startup program exited with code 0xc0000139.
程序未加载的另一个提示是,即使我将 sleep(100) 放入其中,它也会立即存在。
总结:更新整个cygwin安装后问题解决了
详细信息:仅重新安装 g++ 编译器没有帮助。仅将 g++ 编译器更新到新版本并没有帮助。更新整个开发类别并没有帮助。更新基本类别没有帮助。更新整个 cygwin 安装有帮助。至于为什么以前的安装仍然使用“-O2”选项,仍然未知。我可以继续使用“-O2”选项。但是,我选择了对 cygwin 进行完整的更新。
【问题讨论】:
-
Cannot reproduce,据我所知,没有任何理由可以解释为什么虚函数会产生这种效果。
-
不,即使没有 -O2 标志,它仍然会打印测试。
-
@user3196458 - 由于这有点神秘,您能否为工作版本和非工作版本都使用“-g”标志进行编译。然后是“gdb a.exe”,然后是两个编译的“disassemble main”?如果您实际上“逐步”通过代码查看 printf 是否被调用,则会获得奖励积分。
-
@Cramer - 有很多方法可以隐藏这个错误。这些都不会告诉 OP 为什么他的程序(应该按预期工作)不是。
-
我刚刚升级了我的 CygWin 安装。仍然没有复制。
标签: c++ windows g++ cygwin virtual