【问题标题】:C++ CIMG suddenly stopped opening displayC++ CIMG突然停止打开显示
【发布时间】:2021-03-05 06:32:49
【问题描述】:

我现在从事 C++ 项目已经有一段时间了。我每次都用相同的方法打开显示器,将设置的路径传递给CImg<unsigned char>,然后将该对象传递给CImgDisplay,非常标准,并且每次都有效。然后,我开始通过命令行参数传递路径,这也非常有效。然而,一旦我切换回硬编码路径以便在 VS Code 中使用调试器,程序开始吐出一个非常描述性的错误:

在做了一些挖掘之后,我发现了一个更好的错误描述:

[CImg] *** CImgDisplayException *** [instance(0,0,0,[untitled])] CImgDisplay::assign(): Failed to open X11 display.
libc++abi.dylib: terminating with uncaught exception of type cimg_library::CImgDisplayException: [instance(0,0,0,[untitled])] CImgDisplay::assign(): Failed to open X11 display.

从命令行运行程序时(编译完美),错误是Segmentation fault: 11

我尝试在网上查找相同的错误,甚至与 CIMG 无关,因为这是与 X11 相关的错误,但找不到任何东西。当我注释掉整个主函数而不是两个图像和显示声明行时,错误仍然存​​在。代码如下:

#define cimg_use_png
#include "CImg.h"
#include <vector>
#include <algorithm>
#include <iostream>
using namespace cimg_library;
using namespace std;

int main(/*int argc, char *argv[]*/) {
    //CImg<unsigned char> og_pic(argv[1]), first_anim(og_pic.width(),og_pic.height(),1,3,127);
    CImg<unsigned char> og_pic("/Users/glebsvarcer/Desktop/my-stupid-little-programs/maze_solver/test13.png");
    CImgDisplay disp(og_pic, "Test");

    return 0;
}

我正在编译

clang++ -g /Users/glebsvarcer/Desktop/my-stupid-little-programs/maze_solver/cleanup_pic.cpp -O2 -lm -pthread -I/usr/X11R6/include -L/usr/X11R6/lib -lm -pthread -lX11 -o cleanup -Dcimg_use_png -lpng && rm out.txt ; cleanup >> out.txt

这可能是什么原因造成的?如果没有调试器,我真的无法在项目中继续前进,如果有人对此有解决方案,我将不胜感激。

【问题讨论】:

  • 你的DISPLAY环境变量设置了吗?
  • @MarkSetchell 你能澄清一下吗?还是蛮新的。我以前没有配置过它,因为它很好用。
  • 在我这样做之前,您能说明一下您的操作系统是什么吗?还有你是否使用编程 IDE 以及你是如何编译和运行应用程序的?谢谢。
  • @MarkSetchell 我使用 macOS Catalina 10.15.7 和 Visual Studio Code。我使用帖子中的命令通过终端进行编译,然后运行可执行文件。如果我需要调试器,我会通过 VS Code 使用相同的命令进行断点编译

标签: c++ x11 cimg


【解决方案1】:

这里有很多看起来不对的地方。

  • 您是否安装了 XQuartz
  • 您可以运行xterm 并正确显示吗?
  • 您真的在/usr/X11R6 中获得了X11 吗?我从来没有在Mac上看到过。请尝试运行ls -lR /usr/X11R6
  • 您是否尝试过在clang++ 命令中指定实际的C++ 标准?例如。 clang++ -std=c++11 ...
  • 如果你想使用 X11,你应该在你的clang++ 命令中指定-Dcimg_display
  • 您不需要在源文件中的#define cimg_use_png 在编译命令行中AND,只需在后者中执行此操作,以便在任何其他#includes 之前完成,并且对于每个编译单元
  • 如果你想使用PNG图像,你还应该在编译命令中链接zlib。即-lz

【讨论】:

  • 有什么运气/消息吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多