我正在尝试设置一个新的开发环境(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,重新编译了我的代码,它立刻起作用了。
感谢所有帮助过的人。