2017-03-03 12 views
-2

화면 픽셀의 RGB 값 (0-255)을 사용하는 C 프로그램을 작성했습니다. 그것의 위치 (x, y)를 안다. 그것은 리눅스에서 작동하지만 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

이들은 라이브러리가 아니라 헤더입니다. 헤더는 사용 가능한 컴파일러에게 컴파일러에게 알려주는 텍스트 소스 파일입니다. 라이브러리 자체를 구현하지 않으면 쓸모가 없습니다. 이러한 특정 헤더와 라이브러리는 유닉스와 유사한 시스템에 주로 사용됩니다. Cygwin과 같은 Windows 용 Unix 에뮬레이션 레이어가 있습니다. 또는 Windows에서 제공하는 헤더 및 라이브러리를 사용하는 것과 동일한 기능을 가진 코드를 작성할 수 있습니다. 결과는 매우 다를 것입니다. 차이점을 추상화하는 크로스 플랫폼 라이브러리도 있습니다. wxWidgets가 하나의 예입니다. –

+0

이것은 컴파일러 오류가 아니라 충돌입니다. – IInspectable

+0

컴파일러 **가 누락 된 헤더에 대해 ** 충돌하는 경우 디버거에서 실행하고 모든 세부 사항이 포함 된 버그 보고서를 제출해야합니다. – Olaf

답변

2

. X는 UNIX 계열 시스템의 그래픽 디스플레이 의 컨센서스 표준입니다. (OS X는 자유롭게 사용할 수 있습니다).

Windows는 완전히 다른 그래픽 디스플레이 API를 사용합니다. Windows에서 실행되는 X 구현을 찾을 수는 있지만, Microsoft는 확실히이를 제공하지 않습니다. 프로그램이 매우 짧기 때문에 에 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 
); 

, 당신은 GetSysColor(...) 등의 설명

에서 User32.dll

에서 구현 User32.lib에 연결해야이 기능을 사용하려면. al. 접근 가능하다 here. 이 기능은 유사한 기능을 지원하는 많은 기능 중 하나이지만 사용 방법은 완전히 다른 언어와 비슷합니다. Windows 프로그래밍은 Linux 프로그래밍과 거의 비슷합니다. 윈도우 관련 그래픽/이미지 프로그래밍

다른 시작 지점 : 당신은 X11 프로그램을 작성했습니다
capturing an image
Create your own Snipping tool

+0

답변 해 주셔서 감사합니다! 마지막에는 cygwin을 설치했습니다.이제 헤더가 작동하지만 다른 문제를 발견했습니다. Display * d = XOpenDisplay ((char *) NULL); 함수의 매개 변수가 올바르지 않기 때문에 작동하지 않습니다. Linux에서 (char *) NULL은 기본 표시 장치의 환경 변수이지만 Windows에서는 표시되지 않습니다. 여기에 무엇을 써야할지 아십니까? – Sergio