不能用宏包装 cgo 标志
Cannot wrap cgo flags with macros
我做了一个Go程序来模拟按键。为此,我必须使用 cgo 和不同的 C 代码片段,具体取决于 OS 正在编译的 Go 代码。
我编写的代码如下所示:
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
不应该这样使用吗?
#cgo
指令由 go 工具使用,而不是 C 预处理器。
在cgo documentation, there are examples of using build constraints中有条件地设置标志值。你要的是
#cgo windows CFLAGS:-nostdlib
#cgo linux LDFLAGS: -lX11 -lXtst
我做了一个Go程序来模拟按键。为此,我必须使用 cgo 和不同的 C 代码片段,具体取决于 OS 正在编译的 Go 代码。 我编写的代码如下所示:
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
不应该这样使用吗?
#cgo
指令由 go 工具使用,而不是 C 预处理器。
在cgo documentation, there are examples of using build constraints中有条件地设置标志值。你要的是
#cgo windows CFLAGS:-nostdlib
#cgo linux LDFLAGS: -lX11 -lXtst