我正试图在使用GCC的Windows 7上运行Eclipse CDT(64位eclipse)。当我第一次使用GDB时(这本身就是一个挑战),在调试模式下运行程序是我获得输出的唯一方法。正常运行它并没有提供任何控制台输出。经过几个小时的谷歌搜索后,我发现如果我在eclipse中将C:/ cygwin / bin添加到我的环境路径中,我可以在正常运行程序时获得输出。然后我在调试模式下运行它,没有输出。我测试了几次,以确保添加导致问题的路径。这是我正在运行的程序,
#include <iostream>
using namespace std;
int main() {
cout << "Hello World!" << endl;
return 0;
}
那么我如何才能使普通和调试模式都正常工作,为什么我必须首先包含该路径(它已经在我的cygwin路径中以及为什么CDT需要它?)?另外,为什么如果我添加一个路径到我的运行配置,它也会被添加到我的调试配置?
答案 0 :(得分:8)
来自wiki eclipse: 在Windows上的Eclipse CDT中,正在运行或调试的程序的标准输出是完全缓冲的,因为它没有连接到Windows控制台,而是连接到管道。有关详细信息,请参阅错误173732 。在每个printf之后添加flush调用,或者在main函数的开头添加以下行:
setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stderr, NULL, _IONBF, 0);
答案 1 :(得分:6)
我认为我不能回答所有事情,但我使用与你完全相同的设置,而且我不得不处理很多这样的问题(我想知道你是否有麻烦如何使用32位/ 64位JVM和Internet浏览)!
必须指定cygwin / bin路径,因为这是gcc,gdb和所有其他cygwin工具和dll所在的位置(我假设你使用的是gg而不是MinGW风味的cygwin风味)。我相信您必须在Windows环境中指定它(使用win32文件路径),因为Eclipse使用Windows JVM运行,因此处理win32路径。因此,将cygwin/bin
添加到cygwin环境中的PATH
变量并不重要。 CDT正在使用Eclipse寻找cygwin,Eclipse需要从Windows中找到cygwin1.dll。
我可能完全错了,但是如果我不得不猜测我会说你需要确保你已经为这两种配置正确设置了PATH
环境变量。
需要注意的一点是,在Eclipse中, Debug Configurations 窗口中显示的配置与 Run中具有相同名称的配置之间存在无差异配置窗口。两个窗口之间的唯一区别是,一个将在不使用调试器的情况下运行程序,并且具有用于设置调试设置的选项卡。因此,更改一个设置也会影响另一个设置也就不足为奇了。
正如您所知,对于许多项目,构建系统被设置为生成两组(有时更多)二进制文件:一组具有调试信息/符号(DEBUG),另一组没有(RELEASE)。在这种情况下,您通常在Eclipse中有两个配置:一个用于运行DEBUG二进制文件,另一个用于运行RELEASE二进制文件。这两个都将显示在调试配置窗口和运行配置窗口中。关键是您可以使用或不使用gdb运行DEBUG,但gdb不能使用RELEASE。
那就是说,我不确定为什么在运行配置中添加正确的路径会阻止DEBUG二进制文件输出到控制台。我怀疑其他地方正在发生,可能是调试信息和调试器不匹配。
要(希望)回答您关于如何使两个配置都正常工作的问题,请全力以赴并将C:\cygwin\bin;
添加到Windows PATH
环境变量中。我猜这将允许两者都有效。我假设你知道怎么做,但如果不是,请发表评论。
尝试的另一件事是从cygwin shell编译和运行程序。如果它在那里工作,那么使用eclipse时你的PATH
环境变量设置不正确可能是一个安全的选择。
希望有所帮助!
答案 2 :(得分:3)
在gdb 7.3之前添加路径是正确的。现在,当我添加路径时,我无法再使用断点,因为它无法找到dll文件,因为它们不再是路径的一部分。要解决此问题,您可以按照以下说明轻松添加环境中的整个路径。
left click the project
enter the RUN/DEBUG settings for the project
select the executable
click edit
select Environment Tab
click Select...
scroll down to Path (Case sensitive)
check mark Path
press OK
press OK
press OK
您可以看到gdb控制台中显示的dll问题 error,msg =“在启动程序退出时,代码为0xc00000be。” 要么 error,msg =“在启动程序退出时,代码为0x00000135。” 并且您可能会弹出一个错误窗口,说它无法清除断点
答案 3 :(得分:2)
您需要设置链接器 我正在使用MinGW。
按照以下步骤操作。
Goto Project > Properties > C/C++ Build > Settings > Tool Settings (Tab) > MinGW C++ Linker (Option) > Add Command (g++ -static-libgcc -static-libstdc++) (default command is only g++)
答案 4 :(得分:0)
如果它们以Cygwin为目标,则不要从Eclipse内部调试或运行C或C ++应用程序。 TK链接到“你将度过一个糟糕的时光”模因。
如果从正常的Cygwin控制台(你将运行bash)运行程序,Cygwin stdout / stderr会出现问题但是它们确实以几乎所有其他方式运行他们。
程序在Linux和其他支持posix的环境中运行其他程序的正常方法是将i / o重新路由到pty。 Cygwin无法在Windows中支持pty 100%。
@ infoartenovo的答案中的setvbuf调用可以改善一些问题。
此问题的另一面是,使用Windows控制台API编写的应用程序在ptys中无法正常工作。
在无法取胜的战争中,我们都是附带的伤害。
http://cygwin.com/ml/cygwin/2011-12/msg00236.html https://code.google.com/p/mintty/issues/detail?id=56