2017-11-25 90 views
0

我做了一個Go程序來模擬按鍵。爲此,我必須使用cgo和不同的C代碼片段,具體取決於操作系統,正在編譯Go代碼。 我寫的代碼如下所示:無法用宏包裝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 
    } 
} 

代碼編譯Ubuntu的罰款,但在Windows 10,我得到以下錯誤

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 

即使線路#cgo LDFLAGS: -lX11 -lXtst圍繞#ifdef __linux__包裹和#endif。 問題在哪裏? GCC編譯器是否定義了__linux__宏? 關鍵字#cgo是否應該這樣使用?

回答

0

#cgo指令由go工具使用,而不是C預處理器。

cgo documentation中,有一些使用build constraints來有條件地設置標誌值的示例。你想要的是

#cgo windows CFLAGS:-nostdlib 
#cgo linux LDFLAGS: -lX11 -lXtst