2017-03-03 119 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