【问题标题】:Libraries "X11/Xlib.h", "X11/Xutil.h", "unistd.h" for Windows适用于 Windows 的库“X11/Xlib.h”、“X11/Xutil.h”、“unistd.h”
【发布时间】:2017-03-03 20:20:39
【问题描述】:

我已经完成了一个 C 程序,它获取屏幕像素的 RGB 值 (0-255),知道它的位置 (x,y)。它可以在 Linux 中运行,但是当我尝试在 Visual Studio (Windows) 中编译它时,由于库 X11/Xlib.h、X11/Xutil.h、unistd.h 不存在而崩溃。

这是代码:

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>

void getimage(XColor c, Display* d, int* rgb, int x, int y) {
    XImage* image;
    image = XGetImage(d, RootWindow(d, DefaultScreen(d)),
        x, y, 1, 1, AllPlanes, XYPixmap);
    c.pixel = XGetPixel(image, 0, 0);
    XFree(image);
    XQueryColor(d, DefaultColormap(d, DefaultScreen(d)), &c);
    rgb[0] = c.red / 256;
    rgb[1] = c.green / 256;
    rgb[2] = c.blue / 256;
}

int main () {
    int rgb[3], x, y;
    XColor c;
    Display* d = XOpenDisplay((char*)NULL);
    getimage(c, d, rgb, x, y);
}

如何实现它以在 Windows 中运行?

【问题讨论】:

  • 那些是标题,而不是库。头文件是文本源文件,告诉编译器什么是可用的;除非您自己实现了库,否则它们是无用的。这些特定的头文件和库在很大程度上特定于类 Unix 系统。有适用于 Windows 的 Unix 仿真层,例如 Cygwin。或者,您可以使用 Windows 提供的头文件和库编写具有等效功能的代码;结果将是非常不同。还有抽象差异的跨平台库; wxWidgets 就是一个例子。
  • 这是编译器错误,不是崩溃。
  • 如果您的编译器因缺少标头而崩溃,您应该在调试器中运行它并提交包含所有详细信息的错误报告。
  • 感谢您的回答!最后,我安装了cygwin。标题现在可以工作,但我发现了另一个问题: Display *d = XOpenDisplay((char *)NULL);不起作用,因为函数的参数不正确。在 Linux 中,(char *)NULL 是默认显示的环境变量,但在 windows 中不是。你知道在这里写什么吗?

标签: c windows visual-studio xlib unistd.h


【解决方案1】:

您编写了一个 X11 程序。 X 是图形显示的共识标准在 OS X 以外的类 UNIX 系统(但它也可免费用于 OS X)。

Windows 使用完全不同的图形显示 API。可以想象,您可以找到在 Windows 上运行的 X 实现,但微软当然不提供。由于您的程序很短,最好的办法可能是使用 Windows API重写它。

至于unistd.h(和time.h),我在你的程序中看不到任何依赖它的东西。如果你不打算重写程序,你可以通过删除有问题的#include 语句来解决你的问题。

【讨论】:

  • 感谢您的回答!最后,我安装了cygwin。标题现在可以工作,但我发现了另一个问题: Display *d = XOpenDisplay((char *)NULL);不起作用,因为函数的参数不正确。在 Linux 中,(char *)NULL 是默认显示的环境变量,但在 windows 中不是。你知道在这里写什么吗?
  • @Sergio,如果机器上没有运行 X 服务器——除非你安装了一台,否则你可以确定没有——没有可连接的显示器。尽管您已成功构建程序,但它无法在您当前的环境中运行。如果有一个 X 服务器正在运行,那么显示名称字符串的格式会类似于 ":0",但我再说一遍:最好的办法是针对 Windows API 重写程序。
  • 是的,我会这样做的。谢谢!
【解决方案2】:

您的问题的答案的一小部分可能是搜索 MSDN。那里描述了以下功能:(下面的链接)

#include <Windows.h>  
...
DWORD WINAPI GetSysColor(
  _In_ int nIndex
);

要使用该功能,您必须链接到在 User32.dll 中实现的 User32.lib

GetSysColor(...)等的描述。人。可以访问 here。此功能是支持类似功能的众多功能之一,但警告,使用方法将像完全不同的语言。 Windows 编程很少类似于 Linux 编程。

Windows 相关图形/图像编程的其他起点:
capturing an image
Create your own Snipping tool

【讨论】:

  • 感谢您的回答!最后,我安装了cygwin。标题现在可以工作,但我发现了另一个问题: Display *d = XOpenDisplay((char *)NULL);不起作用,因为函数的参数不正确。在 Linux 中,(char *)NULL 是默认显示的环境变量,但在 windows 中不是。你知道在这里写什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 2018-05-12
相关资源
最近更新 更多