2017-11-25 15 views
0

키 누름을 시뮬레이션하는 Go 프로그램을 만들었습니다. 이렇게하려면 Go 코드가 컴파일되는 OS에 따라 C 코드와 다른 코드 조각을 사용해야했습니다.매크로로 cgo 플래그를 바꿀 수 없습니다

package keyboard 

/* 
#include <stdint.h> 
#ifdef __WIN32 
#cgo CFLAGS:-nostdlib 
#include <Windows.h> 

void SetKey(uint16_t key, uint8_t value) { 
    INPUT ip; 

    ip.type = INPUT_KEYBOARD; 
    ip.ki.wScan = 0; 
    ip.ki.time = 0; 
    ip.ki.dwExtraInfo = 0; 

    ip.ki.wVk = key; 
    if (value) { 
     ip.ki.dwFlags = 0; 
    } else { 
     ip.ki.dwFlags = KEYEVENTF_KEYUP; 
    } 

    SendInput(1, &ip, sizeof(INPUT)); 
} 
#endif 

#ifdef __linux__ 
#cgo LDFLAGS: -lX11 -lXtst 
#include <stdlib.h> 
#include <stdio.h> //TODO: REMOVE 

#include <X11/Xlib.h> 
#include <X11/keysym.h> 
#include <X11/extensions/XTest.h> 

void SetKey(uint16_t key, uint8_t value) { 
    Display *display; 
    display = XOpenDisplay(NULL); 

    if(display == NULL) { 
     exit(EXIT_FAILURE); 
    } 

    XTestFakeKeyEvent(display,XKeysymToKeycode(display,key), value, 0); 
    XCloseDisplay(display); 
} 
#endif 
*/ 
import "C" 

func SetKey(keyId uint16, value bool) { 
    C.SetKey(C.uint16_t(keyId),boolToByte(value)); 
} 

func boolToByte(value bool) C.uint8_t { 
    if(value) { 
     return 1 
    } else { 
     return 0 
    } 
} 

코드는 우분투에 잘 컴파일하지만 윈도우 10에 나는 다음과 같은 오류를 얻을 라인 #cgo LDFLAGS: -lX11 -lXtst#ifdef __linux__ 감싸 경우에도

C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/5.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lX11 
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/5.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lXtst 

과 : 내가 쓴 코드는 다음과 같습니다 #endif. 어디에 문제가 있습니까? GCC 컴파일러가 __linux__ 매크로를 정의합니까? 키워드 #cgo은 그런 용도로 사용되지 않아야합니까?

답변

0

#cgo 지시문은 이동 도구에서 사용되며 C 사전 처리기에서는 사용되지 않습니다.

cgo documentation에는 build constraints을 사용하여 조건부로 플래그 값을 설정하는 예가 있습니다. 원하는 것은

#cgo windows CFLAGS:-nostdlib 
#cgo linux LDFLAGS: -lX11 -lXtst 
입니다.