标签: cgo

Golang zmq 绑定,ZMQ4,返回包错误未找到文件 zmq.h

我试图在 Go 应用程序中包含 ZMQ 套接字,但 zmq4 和 gozmq (Go 的 ZMQ 绑定库)都给我带来了问题。我想了解为什么 zmq4 在我的系统上无法导入。

我运行的是 Windows 8 系统,并且使用了 ZMQ 网站上的 Windows 安装程序,版本为 4.0.3。我主要关心的是如何设置 zmq4,这是我在 github 库位置上进行“go get”查询的结果:

> go get github.com/pebbe/zmq4
# github.com/pebbe/zmq4
polling.go:4:17: fatal error: zmq.h: No such file or directory
compilation terminated.
Run Code Online (Sandbox Code Playgroud)

克隆 Github 存储库并不能缓解此问题 - 错误仍然相同。

我知道这个问题与位于我的 ZMQ 安装的“include”文件夹中的 C 库 zmq.h 有关,但依赖关系是由路径问题还是外部工具问题所阻碍对我来说是个谜。

关于 node.js 也出现了类似的错误,这是我在节点脚本之外看到其他人提到的解决方案,但在我的例子中并不成功。

到目前为止,我已将“include”文件夹的路径包含在我的 PATH 环境变量中,并且之前将 zmq.h 放置在 zmq4 顶级文件夹中。我没有太多的武器库来理解这个问题,因为我是 C 和 C 语言的新手,在 Go 中导入包

package go filepath zeromq cgo

5
推荐指数
1
解决办法
3984
查看次数

cgo(达尔文)交叉编译失败

我对 Go 甚至 Linux 都很陌生。

我在 Linux 环境中构建了一个应用程序,它使用基于 cgo 的 gtk 库(https://github.com/mattn/go-gtk/)。该应用程序在其本机环境(linux 64 位)中构建良好,但是当我尝试针对 darwin 64 位进行编译时,我得到以下结果:

# net
could not determine kind of name for C.AI_MASK
# net
could not determine kind of name for C.AI_MASK
Run Code Online (Sandbox Code Playgroud)

我用来构建的命令行:

env GOOS=$1 GOARCH=$2 CGO_ENABLED=1 go build $3
Run Code Online (Sandbox Code Playgroud)

其中 $1 是 darwin,$2 是 amd64($3 是我的应用程序的路径)。

由于错误似乎来自我导入的库,因此我不确定如何修复它。我还读到,交叉编译 cgo 并不能真正工作,因为它依赖于本机 macOS 的东西,因此需要在 mac 上构建。这是真的吗?或者我可以做些什么来让它在我的环境中发挥作用?

我也有点困惑,因为似乎大多数讨论这个主题的人都在谈论 go pre 1.5,如果我理解正确的话,在交叉编译方面这是完全不同的。

谢谢

linux darwin go cgo

5
推荐指数
1
解决办法
4645
查看次数

将 Go 函数作为回调传递给 C

假设我有一个 C 库,代码如下:

typedef int (callback_t)(int);
void register_callback(callback_t cb);
Run Code Online (Sandbox Code Playgroud)

我想为此函数编写 go 绑定并传递任意 go 回调。

我在这里找到了一个很好的答案。然而,这是一个利用回调接受 a 的事实的技巧void *,Go 通过它将函数指针传递给 C 并接收它。但是,这不能应用于我的示例,因为没有 user void *

我能做的最好的事情是:

/*
extern int gobridge(int data);

static int cbridge(void)
{
    register_callback(gobridge);
}
*/
import "C"

type Callback func (int) int

var g_cb Callback

//export gobridge
func gobridge(data C.int) C.int {
    return C.int(g_cb(int(data)))
}

func RegisterCallback(cb Callback) {
    g_cb = cb //save callback in a global
    C.cbridge()
}

func Count(left, right int) { …
Run Code Online (Sandbox Code Playgroud)

c binding go cgo

5
推荐指数
1
解决办法
2167
查看次数

有什么方法可以捕获 cgo 代码中触发的致命错误吗?

我们的应用程序使用odbc驱动程序来访问 Impala 数据库。我们发现,在某些难以复制的情况下,驱动程序将在其 cgo 代码中触发段错误,一旦它通过驱动程序传播回我们的代码,就会表现为致命错误。由于我们希望在这些情况下进行一些清理和警报,因此我实现了一个延迟的恐慌捕捉器,希望这可以捕捉到它们。

但是,它不起作用。致命错误继续直接经过包含调用的延迟函数recover()(因此显然这不是恐慌,尽管打印输出看起来相似),尽管它确实捕获了其他恐慌。github 问题表明无法捕获 cgo 信号,并且如果发生这种情况,应用程序应该立即崩溃。对于我们的生产应用程序来说,这是一个不可接受的崩溃案例,所以我想知道过去 6 年来这种情况是否发生了变化,或者是否有人知道在出现 cgo 信号时运行一些清理代码的另一种方法。根本无法捕获和处理这些致命错误,这似乎是极其糟糕的设计。

go cgo

5
推荐指数
0
解决办法
1458
查看次数

如何在 CGO 中包装库(具有 c++11 功能)

  1. 我的操作系统是 Mac,编译器是 clang
  2. 我想在 Go 中包装一个 C++ 库(openfst,它使用 C++11 功能)
  3. 我遇到了由 c++11 问题引起的错误。似乎 fstlib.h 包含一些使用 c++11 语法的头文件。
In file included from gofst.cpp:2:
In file included from /usr/local/include/fst/fstlib.h:28:
In file included from /usr/local/include/fst/expanded-fst.h:13:
In file included from /usr/local/include/fst/log.h:26:
/usr/local/include/fst/flags.h:143:50: error: a space is required between consecutive right angle brackets (use '> >')
/usr/local/include/fst/flags.h:174:37: error: a space is required between consecutive right …
Run Code Online (Sandbox Code Playgroud)

clang go c++11 cgo openfst

5
推荐指数
0
解决办法
3502
查看次数

Go 中的 size_t 不使用 cgo

这是一个我想移植到Go 结构中的C 结构

struct InputBuffer_t {
   char* buffer;
   size_t buffer_length;
   ssize_t input_length;
};
Run Code Online (Sandbox Code Playgroud)

但是有一种方法可以在Go中声明buffer_length变量,而无需使用C.size_t cgo 指针

这是对可移植性的担忧。如果我这样写Go 结构体,它会是可移植的吗?

type InputBuffer struct {
   Buffer        string
   BufferLength uint32
   InputLength  uint32
};
Run Code Online (Sandbox Code Playgroud)

struct go cgo

5
推荐指数
0
解决办法
2848
查看次数

如何在多个 .go 文件中包含一个头文件?

我有一个标头foo.h和两个源文件main.go以及bar.go.

foo.h包含两个函数:foo(),bar()

main.go我的呼唤中C.foo(),在bar.go我的呼唤中C.bar()

两者都导入伪包“C”和#include "foo.h"

虽然我添加了包含防护foo.h,但我收到以下错误:

在函数中foo::/path/too/foo.h的多个定义foo

同样对于功能bar()

go cgo

5
推荐指数
0
解决办法
994
查看次数

cgo如何抑制警告

我有一个使用 C 库的 cgo 应用程序。在构建过程中,编译器会显示一些警告:

In file included from ./libsolv-sys/src/qsort_r.c:40:0,
                 from ./libsolv-sys/src/util.c:181,
                 from ./libsolv.go:16:
/usr/include/sys/cdefs.h:1:2: warning: #warning usage of non-standard #include <sys/cdefs.h> is deprecated [-Wcpp]
 #warning usage of non-standard #include <sys/cdefs.h> is deprecated
  ^~~~~~~
Run Code Online (Sandbox Code Playgroud)

该库不是由我自己维护的,我无法直接修复此警告。不过我厌倦了这个警告。

问题:如何抑制 CGO 中的警告?

使用过的 CGO 旗帜: CFLAGS: -I./libsolv-sys/src -D LIBSOLV_INTERNAL LDFLAGS: ${SRCDIR}/libsolv-sys.a

go cgo

5
推荐指数
1
解决办法
2513
查看次数

使用 cgo 依赖项构建时间很慢

我有一个使用 Qt 包装器库https://github.com/therecipe/qt的 Go 程序。不幸的是,它的构建时间变得非常长(假设它是 go 部分)

go build -i .  // takes about 14 seconds
go run .       // takes about 8 seconds
Run Code Online (Sandbox Code Playgroud)

运行上述任一命令后,我在$GOPATH/pkg/linux_amd64/github.com/therecipe/qtas.a文件中获得了预编译的依赖项,因此它们不会每次都重新构建。

我尝试使用https://github.com/therecipe/qt/wiki/Faster-builds-(Linux) 中描述的ccacheGold 链接器/usr/bin/ld.gold,但它没有任何改进。这个 Qt 包装器也附带了我尝试过的自己的构建工具,但它的构建时间大致相同。qtdeploy

我正在运行的系统:

go version go1.14.4 linux/amd64
Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
16GB Ram
Run Code Online (Sandbox Code Playgroud)

有谁知道是否有可能至少改善一点构建时间?

编辑:

运行go build -x .显示最大的时间消费者是以下命令

~/.go/pkg/tool/linux_amd64/link -o $WORK/b001/exe/a.out -importcfg $WORK/b001/importcfg.link -buildmode=exe -buildid=k8lYa6JYqRdCY9Gyt0jX/16myMybByG5X6rOfaRpS/WHdW2kCTfMCZs2I4x9WE/k8lYa6JYqRdCY9Gyt0jX -extld=g++ ~/.cache/go-build/b5/b5e47b7f77c2df06ba69937dc8b1399b1289b7c90d2e08b3341fdf13e119c860-d
Run Code Online (Sandbox Code Playgroud)

qt go build-time cgo

5
推荐指数
0
解决办法
451
查看次数

CGO 指针检查中的已知实现错误

根据 CGO 的文档(https://pkg.go.dev/cmd/cgo),在实现中有一个已知的错误:

注意:当前的实现有一个错误。虽然 Go 代码允许将 nil 或 C 指针(但不是 Go 指针)写入 C 内存,但如果 C 内存的内容看起来是 Go 指针,当前实现有时可能会导致运行时错误。因此,如果 Go 代码要在其中存储指针值,请避免将未初始化的 C 内存传递给 Go 代码。在将 C 中的内存传递给 Go 之前将其清零。

我在 GitHub 的问题跟踪器中寻找过这个,但在那里找不到。有人可以详细说明为什么会发生这种情况吗?运行时如何在未初始化的 C 内存中找到 Go 指针?

例如。假设我将一个未初始化的字符数组传递给 C 中的 Go 函数,运行时如何解释该内存中的 Go 指针?

此外,“如果 Go 代码将在其中存储指针值”部分让我感到困惑。为什么以后使用这个内存很重要?

go cgo

5
推荐指数
1
解决办法
99
查看次数

标签 统计

cgo ×10

go ×10

binding ×1

build-time ×1

c ×1

c++11 ×1

clang ×1

darwin ×1

filepath ×1

linux ×1

openfst ×1

package ×1

qt ×1

struct ×1

zeromq ×1