c – 从应用程序调用时Gnuplot崩溃

我想使用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

上一篇:linux – gnuplot – 两个图的交集


下一篇:BUUCTF 梅花香自苦寒来