C ++:g ++编译器:stdio与虚函数的冲突?

时间:2014-03-03 05:31:22

标签: c++ windows g++ cygwin virtual

我无法将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。

2 个答案:

答案 0 :(得分:1)

我所做的是多次更新并重新安装(擦除和下载)Cygwin,但最后我发现我必须将我的g ++编译器从5.2降级到4.9。我想这与Cygwin C ++运行时的特定版本有关。

答案 1 :(得分:0)

此代码中的任何内容均不起作用。

你可以切换到VirtualBox并在Linux VM上运行gcc,这将比在Windows上为Linux建模的cygwin和其他.exe内容更强大。

似乎现在你正在测试编译器的cygwin实现。

相关问题