问题标签 [cgo]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
14285 浏览

go - 如何在golang中使用LDFLAGS的相对路径

我正在尝试构建一个使用静态库(.a 文件)的 golang 程序

我的项目的目录结构如下

test.go 中 cgo 的标志如下

当我为 LDFLAGS -L 使用绝对路径时,它可以正常工作,但是当我将路径更改为相对路径时,例如

然后运行命令

它向我返回一个错误,并说“找不到-ltest”

我的问题是如何在 LDFLAGS 中使用相对路径?,这样我就可以在任何路径中构建项目。

0 投票
1 回答
1975 浏览

go - 如何在不使用 cgo 的情况下将 Go 函数绑定到 C 调用?

在我正在进行的一个项目中,我需要使用 Go 中的一堆 C 函数。当前的实现是使用 cgo 来实现这一点,但是这样做会产生巨大的性能影响,我正在尝试消除它。

  • cgo 将所有 C 代码标记为系统调用,从而使调度程序在需要时分配一个新线程。由于我的项目中大约 80% 的 CPU 时间都花在了繁重的 C 工作上,这很快就会导致有很多线程(500+ 而不是GOMAXPROCS(= 8)),而我的 Linux 内核不太喜欢这些线程。
  • 执行通常的“限制器”方法(使用缓冲通道锁定 cgo 调用)会导致大量互斥体,从而减慢程序速度。

我想继续在这个项目中使用 Go,因为它是管理并发的好方法。

我尝试过的事情:

  • 注释掉一些类似entersyscall()in 的东西src/runtime/cgocall.go(似乎没有多大帮助,我宁愿避免修改 Go 代码)。
  • 将我的代码放在一个 .c 文件中并从 Go 调用它,而不使用 .c 文件import "C"。这里没有运气 - 我无法调用该函数,并且当我编写函数名称时,package·function编译器抱怨文件中的无效字符。
  • 使用 .s 文件并将其编写为程序集。我的 asm 不是那么好,我无法弄清楚。

所以,我的问题是:如何在避免 cgo 开销的同时使用 Go 中的 C 函数?

旁注:我知道为什么 cgo 将所有调用标记为系统调用,但在这种特定情况下,我调用的函数不会阻塞锁或 IO。

0 投票
1 回答
2398 浏览

sqlite - golang:CGO/clang 与 sqlite3.c

我想编译到 osx 上。使用以下命令: GOOS=linux GOARCH=arm CGO_ENABLED=1 go build -o foo main.go

但我得到:运行时/cgo clang:错误:编译期间未使用的参数:'-mno-thumb'

我使用这个包:https ://github.com/mattn/go-sqlite3 我尝试了提示:https ://github.com/mattn/go-sqlite3/issues/106

感谢您的每一个帮助:-)

0 投票
3 回答
3499 浏览

go - 如何在 golang 的 cgo 中使用 std::vector 或其他容器?

我想将大量对象malloc到内存中。(大约1亿个对象)因为golang的gc不够有效,所以我需要使用c/c++来malloc内存并使用std::vector来保存对象。这是我的代码,我想在 cgo 中使用 std 容器:

并在下面显示错误消息:

我该如何设置包含路径或者还有其他想法吗?

0 投票
3 回答
11191 浏览

c - 为什么cgo的性能这么慢?我的测试代码有问题吗?

我正在做一个测试:比较 cgo 和纯 Go 函数的执行时间,每个函数运行 1 亿次。与 Golang 函数相比,cgo 函数需要更长的时间,我对这个结果感到困惑。我的测试代码是:

结果是:

结果表明调用 C 函数比 Go 函数慢。我的测试代码有问题吗?

我的系统是:mac OS X 10.9.4 (13E28)

0 投票
1 回答
2076 浏览

go - 为什么我的交叉编译 CGO 二进制文件不能在 Raspberry Pi (Raspbian) 上运行?

当我编译以下代码片段(游乐场链接)时:

…使用这些环境变量:

我得到一个 1.6Mb 的二进制文件:

  • 适用于我的 ODROID-C1(ARMv7,运行 Arch,来自 archlinuxarm.org),但是
  • 不适用于我的 Raspberry Pi B+(ARMv6,运行 Raspbian,来自 raspberrypi.org)。

当我在 Pi 上运行它时,我得到一个“ Segmentation fault”。

当我使用这些环境变量运行它时:

我得到这个输出:

删除/usr/lib/arm-linux-gnueabihf/libcofi_rpi.sofrom/etc/ld.so.preload给了我相同的输出,除了没有包含libcofi_rpi.so.

尝试构建一个静态链接的二进制文件-tags netgo -a -ldflags "-linkmode external -extldflags -static"给了我一个“ Illegal instruction”而不是“ Segmentation fault”。

尝试在 Pi 本身上构建二进制文件是可行的,但是,我想交叉编译它。并且交叉编译确实有效,但仅适用于 ODROID-C1/Arch,不适用于 Raspberry Pi/Raspbian。

我使用的确切构建步骤可以使用 Docker 重现:

在 docker 内部,我运行:

这给了我一个名为“test”的可执行文件,如上所述,它不会在 Pi 上运行。

以下是有关我的测试设备的一些信息:

树莓派 B+:

已安装的蓝牙库:

ODROID-C1:

已安装的蓝牙库和开发头文件:

Docker构建环境

安装的蓝牙开发头:


在 Docker 容器中安装与 Pi 上可用的完全相同的版本libbluetooth-dev没有区别。


将较新的 Jessie 复制libbluetooth.so到 Wheezie 会给我这个错误:


更新:

在 Pi 上使用 Arch 进行了尝试,交叉编译的二进制文件也会出现段错误,使用,或给出相同的消息(“ Illegal instruction (core dumped)”)。GOARM=567

到目前为止,我还没有找到一种方法来交叉编译 Pi 的 CGO 代码,链接到libbluetooth.

明天将尝试使用 Raspberry Pi 2。

0 投票
1 回答
1016 浏览

go - 从 C 代码调用 Go 库

我找到了大量关于如何使用 cgo 从 Go 调用 C 库的信息,但我对相反的感兴趣:用 Go 编写一个库,并在各种 C 程序中链接/使用它。

这可能吗?有什么好的资源吗?谢谢。

0 投票
1 回答
1523 浏览

c++ - 在 Go (golang) 和 C++ 之间交换数据结构(数组)

我正在尝试将 C++ 库连接到用 Go 编写的应用服务器。目标是 C++ 库和 appserver 都在使用一个通用的数据结构,这意味着:

  1. Go 应用服务器可以访问由 C++ 库创建的数组。
  2. C++ 库可以处理由 Go 应用服务器创建的数组。

我正在玩一点 cgo 并连接 C++,到目前为止一切正常......但是,当涉及到交换指向数据结构的指针时,我迷路了。到目前为止我尝试了什么:

接口实现如下所示:

最后 go 实现看起来像:

编译时收到以下错误:

所以我的问题是:如何在 C++ 和 Go 之间交换指向数据结构的指针。上面我只是描述了从 C++ 到 GO 的方式,但我也对另一种方式感兴趣。

非常感谢您提前提供的帮助。

0 投票
1 回答
7228 浏览

go - cgo:架构 x86_64 的未定义符号

我想从 C 函数空间调用 go func,但程序抛出构建错误。

例子.go

测试.c

当我执行命令来运行/构建(go buildgo run example.gogo build example.go)程序时,它会引发错误:

我正在按照cgo 幻灯片编写程序。请让我知道这里的任何错误。

Edit1:我使用的是 OS-X 10.9 操作系统。

Edit2: 之间有一个额外的空格,和之间// export应该没有空格。但是现在我在构建时收到以下错误://export

0 投票
1 回答
800 浏览

macos - 使用 golang 进行 Mac 交叉编译(或替代方案)

好的,所以我正在尝试在我的 mac 上编译我的Awesomium go包装器(在 linux 上一切正常)。我的问题是,当我尝试编译时,我得到

ld:警告:忽略文件/Library/Frameworks//Awesomium.framework/Awesomium,文件是为i386构建的,它不是被链接的架构(x86_64):/Library/Frameworks//Awesomium.framework/Awesomium 架构x86_64的未定义符号:

美好的。但这提出了几个问题。首先,我没有为 Mac 下载 x86_64 版本的选项,它是“mac 版本”,没有架构。其次,我检查了其他一些库,似乎没有构建 x86_64。
现在我想也许我可以为 osx 制作一个 i386 版本,但交叉编译 cgo 似乎非常困难,有人说不可能。

我有哪些选择?