声明std :: string后,C ++ printf不再有效

时间:2016-01-16 20:15:34

标签: c++ g++ cygwin printf stdstring

我正在尝试设置一个新的开发环境(Windows 7上的Cygwin64),以下测试代码无效:

#include <stdio.h>
#include <string>

int main(int argc, char *argv[])
{
    printf("%s", "Enter main\n\n");
    std::string str;
    printf("%s", "Exit main\n\n");
}

它编译,但没有输出:

$ g++ test1.cpp

$ ./a.exe

当我评论str的声明时,它可以正常工作:

$ ./a.exe

Enter main

Exit main

我必须错过一些非常简单的事情。永远不会引用该字符串,因此声明它必须在代码中暴露其他一些问题。

原始代码更长并且执行了更多操作,但具有相同的行为:没有打印任何内容。我将代码缩减到这个最小的例子。 printfs只是用于调试:请不要回复使用cout来代替使用cout。

编辑:我花了几个小时研究Avast Anti-Virus可能是罪魁祸首的理论。排除我的代码目录没有帮助,也没有禁用Avast。当我使用Avast扫描a.exe时,它未被识别为威胁。最后,我将工作和非工作可执行文件复制到我的工作计算机。在我的工作计算机上,没有任何内容通过二进制文件打印到控制台。两台计算机都运行Windows 7.我的家用计算机运行的是Avast,而不是McAfee。我的工作计算机运行的是McAfee Anti-Virus,而不是Avast。显然,有些东西干扰了在家用计算机上执行二进制文件。它似乎不是Avast,但我不知道它是什么。

编辑:A / V理论现在似乎不太合理。有人建议它可能是路径问题,例如Cygwin的标准库不在我的路径中。起初听起来很合理:

$ ldd good.exe
    ntdll.dll => /cygdrive/c/Windows/SYSTEM32/ntdll.dll (0x779b0000)
    kernel32.dll => /cygdrive/c/Windows/system32/kernel32.dll (0x77890000)
    KERNELBASE.dll => /cygdrive/c/Windows/system32/KERNELBASE.dll (0x7fefdaa0000)
    cygwin1.dll => /usr/bin/cygwin1.dll (0x180040000)

$ ldd bad.exe
    ntdll.dll => /cygdrive/c/Windows/SYSTEM32/ntdll.dll (0x779b0000)
    kernel32.dll => /cygdrive/c/Windows/system32/kernel32.dll (0x77890000)
    KERNELBASE.dll => /cygdrive/c/Windows/system32/KERNELBASE.dll (0x7fefdaa0000)
    cygwin1.dll => /usr/bin/cygwin1.dll (0x180040000)
    cyggcc_s-seh-1.dll => /usr/bin/cyggcc_s-seh-1.dll (0x3ffa10000)
    cygstdc++-6.dll => /usr/bin/cygstdc++-6.dll (0x3febb0000)

但事实证明/usr/bin正好在我的$ PATH的开头。

$ echo $PATH
/cygdrive/d/cygwin64/bin:/usr/local/bin:/usr/bin: (etc.)

当我在gdb下运行时,我收到此错误:

During startup program exited with code 0xc0000139.

我认为是无法加载DLL。当我运行Dependency Walker时,它找不到它所依赖的三个Cygwin DLLS中的任何一个,我在/usr/bin中可以清楚地看到它们。

已解决:当我宣布std::string(例如cygstdc++-6.dll)未加载时,所需的cygwin DLL,尽管在我的路径中。事实证明,使用g ++ 5.2.x编译的程序尝试加载它们时存在已知问题。我降级到g ++ 4.9.3,重新编译了我的代码,它立刻起作用了。

感谢所有帮助过的人。

0 个答案:

没有答案