我试图在Go程序中使用OpenGL.我想我已经完成了所有的工作,但我仍然无法让它运行起来.
我的C编译器是mingw的64位版本.它在我的%PATH%变量中,我已经验证它使用cgo文档中的随机数示例.
我通过将bin,lib和include文件夹应用到\mingw\x86_64-w64-mingw32mingw-w64安装中的等效文件来安装64位GLEW 1.9.0 .
当我尝试运行时go get github.com/go-gl/gl,请回复以下内容:
In file included from attriblocation.go:7:0:
gl.h:5:25: error: enumerator value for '__cgo_enum__5' is not an integer constant
#define GLEW_GET_FUN(x) (*x)
^
d:\programs\mingw64\x86_64-w64-mingw32\include\gl\glew.h:1956:26: note: in expansion of macro 'GLEW_GET_FUN'
#define glVertexAttrib3f GLEW_GET_FUN(__glewVertexAttrib3f)
^
gl.h:5:25: error: enumerator value for '__cgo_enum__6' is not an integer constant
#define GLEW_GET_FUN(x) (*x)
Run Code Online (Sandbox Code Playgroud)
对于值达到的值,这些错误以类似的方式继续__cgo_enum__15.我也从每个条目的Go方面得到一些匹配错误.
关于我缺少什么的想法让这个工作?
编辑:以下是来自Go方面的"匹配"日志.
attriblocation.go:42:2: error: initializer element is not constant …Run Code Online (Sandbox Code Playgroud) C代码工作正常并正确进入命名空间,但Go代码似乎总是从setns调用返回EINVAL 进入mnt命名空间.我已经尝试了数置换(包括嵌入的C代码与CGO和外部的.so)上的Go 1.2,1.3和当前的尖端.
单步执行代码gdb表明两个序列都setns以libc完全相同的方式调用(或者它在我看来).
我已经把下面的代码中的问题煮成了问题.我究竟做错了什么?
我有一个用于启动快速busybox容器的shell别名:
alias startbb='docker inspect --format "{{ .State.Pid }}" $(docker run -d busybox sleep 1000000)'
Run Code Online (Sandbox Code Playgroud)
运行之后,startbb将启动一个容器并输出它的PID.
lxc-checkconfig 输出:
Found kernel config file /boot/config-3.8.0-44-generic
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: missing
Network namespace: enabled
Multiple /dev/pts instances: enabled
--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup …Run Code Online (Sandbox Code Playgroud) 我试图在 python 的 go 脚本中运行一个简单的程序,但出现了分段错误。这是我的代码:
main.go
package main
import (
/*
typedef struct foo{
int a;
int b;
int c;
int d;
int e;
int f;
} foo;
*/
"C"
)
func main() {}
//export Foo
func Foo(t []int) C.foo {
return C.foo{}
}
Run Code Online (Sandbox Code Playgroud)
主文件
# loading shared object
lib = cdll.LoadLibrary("main.so")
# go type
class GoSlice(Structure):
_fields_ = [("data", POINTER(c_void_p)), ("len", c_longlong), ("cap", c_longlong)]
lib.Foo.argtypes = [GoSlice]
lib.Foo.restype = c_void_p
t = GoSlice((c_void_p * 5)(1, 2, 3, 4, 5), …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建(构建)以下内容:
package main
import (
"fmt"
_ "github.com/d2g/unqlitego"
_ "github.com/mattn/go-sqlite3"
)
func main() {
fmt.Println("Erm Compile?")
}
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
重复的符号引用:github.com/d2g/unqlitego(.text)和github.com/mattn/go-sqlite3(.text)中的__moddi3
我正在运行版本go1.3.1 windows/386.
难道我做错了什么?你会如何解决这类问题?
这个OS/Go版本/架构特定的错误?(我很感激"它适合我",你的输出go version)
我把这一切都放在了一个回购中,所以你应该能够做到go get github.com/d2g/issue-duplicate_symbol.
根据评论看起来似乎已登录Windows 386问题:https://code.google.com/p/go/issues/detail?id = 8702
我有一个byte.Buffer,我使用binary.Write()函数打包数据.然后我需要将此字节数组发送到C函数.使用Go 1.6我没有成功解决这个问题.
buf := new(bytes.Buffer) //create my buffer
....
binary.Write(buf, binary.LittleEndian, data) //write my data to buffer here
addr := (*C.uchar)(unsafe.Pointer(&buf.Bytes()[0])) //convert buffers byte array to a C array
rc := C.the_function(addr, C.int(buf.Len())) //Fails here
Run Code Online (Sandbox Code Playgroud)
它在调用C函数的行上失败了:
panic: runtime error: cgo argument has Go pointer to Go pointer
Run Code Online (Sandbox Code Playgroud)
C函数:
int the_function(const void *data, int nbytes);
Run Code Online (Sandbox Code Playgroud)
我能够得到以下工作,但是将字节数组转换为字符串感觉不对.有一个更好的方法吗?这种方法是否会对数据产生副作用?
addr := unsafe.Pointer(C.CString(string(buf.Bytes()[0]))
Run Code Online (Sandbox Code Playgroud)
再次,这需要在Go 1.6下工作,它引入了更严格的cgo指针规则.
谢谢.
将一个简单的程序从C#重写为Go,我发现生成的可执行文件慢了3到4倍.特别是Go版本使用3到4倍的CPU.这是令人惊讶的,因为代码执行许多I/O并且不应该消耗大量的CPU.
我做了一个非常简单的版本,只进行顺序写入,并做了基准测试.我在Windows 10和Linux(Debian Jessie)上运行相同的基准测试.时间无法比较(不是相同的系统,磁盘......)但结果很有趣.
我在两个平台上都使用相同的Go版本:1.6
在Windows上,os.File.Write使用cgo(见runtime.cgocall下文),而不是在Linux上.为什么?
这是disk.go程序:
package main
import (
"crypto/rand"
"fmt"
"os"
"time"
)
const (
// size of the test file
fullSize = 268435456
// size of read/write per call
partSize = 128
// path of temporary test file
filePath = "./bigfile.tmp"
)
func main() {
buffer := make([]byte, partSize)
seqWrite := func() error {
return sequentialWrite(filePath, fullSize, buffer)
}
err := fillBuffer(buffer)
panicIfError(err)
duration, err := durationOf(seqWrite)
panicIfError(err)
fmt.Printf("Duration : %v\n", duration)
}
// …Run Code Online (Sandbox Code Playgroud) 我正试图在Windows上使用cgo库,即 github.com/mattn/go-sqlite3
我使用Cygwin64并安装了所有"开发"软件包,因此可以使用gcc.
但运行go get github.com/mattn/go-sqlite3结果:
/usr/lib/gcc/x86_64-pc-cygwin/5.3.0/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lmingwex
/usr/lib/gcc/x86_64-pc-cygwin/5.3.0/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lmingw32
Run Code Online (Sandbox Code Playgroud)
如果我在Cygwin安装程序中搜索"mingwex"和"mingw32",我没有得到任何结果.我是在寻找错误的名称还是在64位系统上没有?
或者有更好的方法在Windows上使用该库?
请注意,README声明了这一点
但是,如果您使用go install github.com/mattn/go-sqlite3安装go-sqlite3,则不再需要gcc来构建您的应用程序
但如果我使用,我会收到相同的错误消息go install.
$ go version
go version go1.6.2 windows/amd64
Run Code Online (Sandbox Code Playgroud) 我遇到了Go程序使用.so lib的问题,而c代码需要处理SIGALRM信号.但似乎一旦信号SIGALRM发布,程序就会崩溃.从"The Go Programming Language"我看到:
如果非Go代码安装任何信号处理程序,则必须使用带有sigaction的SA_ONSTACK标志.如果未收到信号,则可能导致程序崩溃.
任何人都可以通过sigaction显示SA_ONSTACK标志的用法.我非常感激.
以下是我的代码:
// LIC_TIMER_CALLBACK_FUNC is a function pointer
static LIC_TIMER_CALLBACK_FUNC s_pfnTmCallBack;
static void _OS_TriggerTask(int iSig)
{
logInfo("_OS_TriggerTask start...");
if (LIC_NULL_PTR != s_pfnTmCallBack)
{
logInfo("call timer callback...");
s_pfnTmCallBack(0);
}
logInfo("_OS_TriggerTask end...");
}
// set the trigger
int OS_StartTrigger(int ulLength, LIC_TIMER_CALLBACK_FUNC pfnTmCallBack)
{
logInfo("OS_StartTrigger start...");
s_pfnTmCallBack = pfnTmCallBack;
struct sigaction stSigact;
stSigact.sa_handler = _OS_TriggerTask;
stSigact.sa_flags = SA_ONSTACK;
sigemptyset(&stSigact.sa_mask);
int iRet = sigaction(SIGALRM, &stSigact, NULL);
if(0 != iRet)
{
logError("set signal failed...");
}
else
{
logInfo("set signal …Run Code Online (Sandbox Code Playgroud) 要求:应用程序必须容器化为 docker 镜像,并且需要支持arm64和amd64架构。
代码库:它是一个 golang 应用程序,需要使用git2go库,并且必须CGO_ENABLED=1构建项目。最小的可重现示例可以在 github 上找到。
主机:我使用 arm64 M1 mac 和 docker 桌面来构建应用程序,但结果在我们的 amd64 Jenkins CI 构建系统上类似。
Dockerfile:
FROM golang:1.17.6-alpine3.15 as builder
WORKDIR /workspace
COPY go.mod go.mod
COPY go.sum go.sum
RUN apk add --no-cache libgit2 libgit2-dev git gcc g++ pkgconfig
RUN go mod download
COPY main.go main.go
ARG TARGETARCH TARGETOS
RUN CGO_ENABLED=1 GO111MODULE=on GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -tags static,system_libgit2 -a -o gitoperations main.go
FROM …Run Code Online (Sandbox Code Playgroud) 上下文:我正在阅读多篇有关使我的 golang 应用程序符合 FIPS 规范的文章(换句话说,使我的应用程序使用 Boringcrypto 而不是本机 golang 加密):
\n简而言之,他们都说要跑
\n# Build a binary and assert that it uses boringcrypto instead of the native golang crypto\nRUN GOEXPERIMENT=boringcrypto go build . && \\\n go tool nm fips-echo-server > tags.txt && \\\n grep \'_Cfunc__goboringcrypto_\' tags.txt 1> /dev/null\nRun Code Online (Sandbox Code Playgroud)\n然后期望以下输出:
\n e70fa0 T _cgo_d3bdb93f8e25_Cfunc__goboringcrypto_AES_cbc_encrypt\n e70fc0 T _cgo_d3bdb93f8e25_Cfunc__goboringcrypto_AES_ctr128_encrypt\n e70ff0 T _cgo_d3bdb93f8e25_Cfunc__goboringcrypto_AES_decrypt\n e71000 T _cgo_d3bdb93f8e25_Cfunc__goboringcrypto_AES_encrypt\n e71010 T _cgo_d3bdb93f8e25_Cfunc__goboringcrypto_AES_set_decrypt_key\n e71050 T _cgo_d3bdb93f8e25_Cfunc__goboringcrypto_AES_set_encrypt_key\n e71200 T _cgo_d3bdb93f8e25_Cfunc__goboringcrypto_BN_bn2le_padded\n e71240 T _cgo_d3bdb93f8e25_Cfunc__goboringcrypto_BN_free\n …Run Code Online (Sandbox Code Playgroud)