标签: cgo

使用Go的OpenGL

我试图在Go程序中使用OpenGL.我我已经完成了所有的工作,但我仍然无法让它运行起来.

我的C编译器是mingw64位版本.它在我的%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)

opengl go mingw-w64 cgo

11
推荐指数
1
解决办法
2211
查看次数

从Go调用setns为mnt命名空间返回EINVAL

C代码工作正常并正确进入命名空间,但Go代码似乎总是从setns调用返回EINVAL 进入mnt命名空间.我已经尝试了数置换(包括嵌入的C代码与CGO和外部的.so)上的Go 1.2,1.3和当前的尖端.

单步执行代码gdb表明两个序列都setnslibc完全相同的方式调用(或者它在我看来).

我已经把下面的代码中的问题煮成了问题.我究竟做错了什么?

建立

我有一个用于启动快速bu​​sybox容器的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)

c linux system-calls go cgo

10
推荐指数
1
解决办法
1677
查看次数

从 Python 调用 Go

我试图在 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)

python go python-3.x cgo

10
推荐指数
1
解决办法
9806
查看次数

为什么在包含两个基于cgo的库时会得到"重复符号引用"?

我正在尝试构建(构建)以下内容:

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

sqlite go cgo unqlite

9
推荐指数
1
解决办法
1039
查看次数

将Go [] byte转换为C*char

我有一个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指针规则.

谢谢.

go cgo

9
推荐指数
1
解决办法
1万
查看次数

为什么Go在Windows上使用cgo来获得简单的File.Write?

将一个简单的程序从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)

linux windows go cgo

9
推荐指数
1
解决办法
417
查看次数

在Cygwin64上编译cgo lib:"ld:找不到-lmingw32"

我正试图在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)

sqlite gcc cygwin go cgo

9
推荐指数
1
解决办法
5075
查看次数

cgo如何处理信号?

我遇到了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)

go cgo

9
推荐指数
1
解决办法
607
查看次数

Golang 与 docker 镜像内的 CGO 交叉编译

要求:应用程序必须容器化为 docker 镜像,并且需要支持arm64amd64架构。

代码库:它是一个 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)

gcc go cgo docker buildx

9
推荐指数
1
解决办法
3037
查看次数

如何检查我的 golang 应用程序是否使用 Boringcrypto 而不是本机 golang crypto?

上下文:我正在阅读多篇有关使我的 golang 应用程序符合 FIPS 规范的文章(换句话说,使我的应用程序使用 Boringcrypto 而不是本机 golang 加密):

\n\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\n
Run 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)

fips go cgo

9
推荐指数
1
解决办法
3150
查看次数

标签 统计

cgo ×10

go ×10

gcc ×2

linux ×2

sqlite ×2

buildx ×1

c ×1

cygwin ×1

docker ×1

fips ×1

mingw-w64 ×1

opengl ×1

python ×1

python-3.x ×1

system-calls ×1

unqlite ×1

windows ×1