2017-03-03 690 views
-2

我已经完成了一个C程序,它将屏幕像素的RGB值(0-255)知道它的位置(x,y)。它适用于Linux,但是当我尝试在Visual Studio(Windows)中编译它时,由于库X11/Xlib.h,X11/Xutil.h,unistd.h不存在而崩溃。用于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上运行?

+1

这些是标题,而不是库。头文件是文本源文件,告诉编译器有什么可用的;除非你自己实现了库,否则它们是无用的。这些特定的头文件和库很大程度上是针对类Unix系统的。 Windows上有Unix仿真层,比如Cygwin。或者,您可以编写具有相同功能的代码,使用Windows提供的标题和库;结果将会非常不同。还有跨平台的库可以抽象出不同之处; wxWidgets就是一个例子。 –

+0

这是编译器错误,不是崩溃。 – IInspectable

+0

如果您的编译器**因丢失头文件而崩溃**,您应该在调试器中运行它并提交包含所有详细信息的错误报告。 – Olaf

回答

2

你写的X11程序。 X是除OS X之外的类UNIX系统上的图形显示的共识标准(但它也可以免费用于OS X)。

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

至于unistd.h(和time.h),我没有看到任何依赖它的程序中。如果您不打算重写该程序,只需删除违规的#include声明即可解决问题的部分内容。

+0

感谢您的回答!最后,我安装了cygwin。现在头文件可以工作,但是我发现了另一个问题:Display * d = XOpenDisplay((char *)NULL);由于该函数的参数不正确而不工作。在Linux中,(char *)NULL是默认显示的环境变量,但不在windows中。你知道这里写什么吗? – Sergio

+1

@Sergio,如果机器上没有运行X服务器 - 除非你安装了一台服务器,否则你可以确定没有 - 没有可用的显示器可以连接。尽管你已经成功地构建了你的程序,但它不能在你现在的环境中运行。如果有一个X服务器在运行,那么显示名称字符串的形式应该类似'“:0”',但是我再说一遍:最好的办法是用Windows API重写程序。 –

+0

是的,我会这样做的。谢谢! – Sergio

1

您的问题的答案的一小部分可能是搜索MSDN周围。下面的函数有描述:(以下链接)

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

要使用该功能,则必须链接到USER32.LIB其在User32.dll中

GetSysColor(...)等的描述来实现。人。都可以访问here。这个函数是许多支持类似功能的函数之一,但是警告,这些使用方法将会像一种完全不同的语言。 Windows编程很少类似于Linux编程。

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

+0

感谢您的回答!最后,我安装了cygwin。现在头文件可以工作,但是我发现了另一个问题:Display * d = XOpenDisplay((char *)NULL);由于该函数的参数不正确而不工作。在Linux中,(char *)NULL是默认显示的环境变量,但不在windows中。你知道这里写什么吗? – Sergio

相关问题