【问题标题】:C++: g++ compiler: clash of stdio with virtual functions?C++:g++ 编译器:stdio 与虚函数的冲突?
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这段代码中没有什么是不应该工作的。

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

    看来您现在正在测试编译器的 cygwin 实现。

    【讨论】:

      猜你喜欢
      • 2012-08-28
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 2019-07-12
      相关资源
      最近更新 更多