我想使用gnuplot在控制台应用程序(C,Eclipse CDT,Linux)中绘制我的结果.我创建了一个简单的类来简化操作(参见下面的代码).我尝试在我的主要情节中绘制测试图:
int main() {
Gnuplot plot;
plot("plot sin(x)") ;
cout<<"Press button:";
cin.get();
return 0;
}
我的问题是,如果我正常启动我的应用程序,我会收到一条运行时错误消息“无法初始化wxWidgets”.执行线图(“plot sin(x)”)后的分段错误(核心转储).但是,如果我在调试模式中单步执行代码,则代码工作正常,我的绘图窗口按正常情况显示为预期.欢迎任何帮助.
#ifndef GNUPLOT_H_
#define GNUPLOT_H_
#include <string>
using namespace std;
class Gnuplot {
public:
Gnuplot() ;
~Gnuplot();
void operator ()(const string & command); // send any command to gnuplot
protected:
FILE *gnuplotpipe;
};
#endif
和来源:
#include "gnuplot.h"
#include <iostream>
#include <string>
#include "stdio.h"
Gnuplot::Gnuplot() {
gnuplotpipe=popen("gnuplot -persist","w");
if (!gnuplotpipe) {
cerr<< ("Gnuplot not found !");
}
}
Gnuplot::~Gnuplot() {
fprintf(gnuplotpipe,"exit\n");
pclose(gnuplotpipe);
}
void Gnuplot::operator()(const string & command) {
fprintf(gnuplotpipe,"%s\n",command.c_str());
fflush(gnuplotpipe);// flush is neccessary, nothing gets plotted else
};
解决方法:
没有到X服务器的链接执行将导致此问题.通常情况下,ssh不会为您提供指向X服务器的链接(但可以配置或切换为执行此操作).我发现我可以复制“ssh localhost”引用的错误并输入gnuplot和一个绘图命令,它会假设wxt是终端类型并且无法初始化wxWidgets错误和segfault.
但是,如果我先这样做,我发现它对我有用.
警告:第一个命令“xhost”是危险的,它会禁用X安全性,并允许任何在互联网上的任何地方连接到您的屏幕,键盘或鼠标.如果机器位于网络地址转换路由器后面,例如家庭网络中使用的那些,则这可能不是问题.
来自shell:
xhost +
export DISPLAY=:0.0
以编程方式启动gnuplot,然后正常发送gnuplot命令.
应该管用.在ssh登录中为我工作.如果没有,请检查您正在使用的环境以启动新进程,并在其中明确显示“DISPLAY =:0.0”.这意味着连接到本地显示器.可以在以下位置之前添加主机名:
在Linux下,gnuplot通常会查找X服务器.它可能找不到它.
也许如果目标是将图表保存在文件中,那么添加:
set terminal png
set output 'graph.png'
到“plot”命令之前的gnuplot命令.即使在无头服务器上也应如此.
如果要控制输出文件名,只需发送一些其他名称而不是graph.png