2017-11-25 13 views
0

キープレスをシミュレートするGoプログラムを作成しました。そのためには、GoコードがコンパイルされているOSに応じて、Cコードと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 
    } 
} 

コードはUbuntuの上の罰金コンパイルが、Windows 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ディレクティブは、goツールで使用され、Cプリプロセッサでは使用されません。

には、build constraintsを使用してフラグ値を条件付きで設定する例があります。あなたが欲しいのは

#cgo windows CFLAGS:-nostdlib 
#cgo linux LDFLAGS: -lX11 -lXtst 
です
関連する問題