问题标签 [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.
go - 如何在golang中使用LDFLAGS的相对路径
我正在尝试构建一个使用静态库(.a 文件)的 golang 程序
我的项目的目录结构如下
test.go 中 cgo 的标志如下
当我为 LDFLAGS -L 使用绝对路径时,它可以正常工作,但是当我将路径更改为相对路径时,例如
然后运行命令
它向我返回一个错误,并说“找不到-ltest”
我的问题是如何在 LDFLAGS 中使用相对路径?,这样我就可以在任何路径中构建项目。
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。
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
感谢您的每一个帮助:-)
go - 如何在 golang 的 cgo 中使用 std::vector 或其他容器?
我想将大量对象malloc到内存中。(大约1亿个对象)因为golang的gc不够有效,所以我需要使用c/c++来malloc内存并使用std::vector来保存对象。这是我的代码,我想在 cgo 中使用 std 容器:
并在下面显示错误消息:
我该如何设置包含路径或者还有其他想法吗?
c - 为什么cgo的性能这么慢?我的测试代码有问题吗?
我正在做一个测试:比较 cgo 和纯 Go 函数的执行时间,每个函数运行 1 亿次。与 Golang 函数相比,cgo 函数需要更长的时间,我对这个结果感到困惑。我的测试代码是:
结果是:
结果表明调用 C 函数比 Go 函数慢。我的测试代码有问题吗?
我的系统是:mac OS X 10.9.4 (13E28)
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.so
from/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=5
6
7
到目前为止,我还没有找到一种方法来交叉编译 Pi 的 CGO 代码,链接到libbluetooth
.
明天将尝试使用 Raspberry Pi 2。
go - 从 C 代码调用 Go 库
我找到了大量关于如何使用 cgo 从 Go 调用 C 库的信息,但我对相反的感兴趣:用 Go 编写一个库,并在各种 C 程序中链接/使用它。
这可能吗?有什么好的资源吗?谢谢。
c++ - 在 Go (golang) 和 C++ 之间交换数据结构(数组)
我正在尝试将 C++ 库连接到用 Go 编写的应用服务器。目标是 C++ 库和 appserver 都在使用一个通用的数据结构,这意味着:
- Go 应用服务器可以访问由 C++ 库创建的数组。
- C++ 库可以处理由 Go 应用服务器创建的数组。
我正在玩一点 cgo 并连接 C++,到目前为止一切正常......但是,当涉及到交换指向数据结构的指针时,我迷路了。到目前为止我尝试了什么:
接口实现如下所示:
最后 go 实现看起来像:
编译时收到以下错误:
所以我的问题是:如何在 C++ 和 Go 之间交换指向数据结构的指针。上面我只是描述了从 C++ 到 GO 的方式,但我也对另一种方式感兴趣。
非常感谢您提前提供的帮助。
go - cgo:架构 x86_64 的未定义符号
我想从 C 函数空间调用 go func,但程序抛出构建错误。
例子.go
测试.c
当我执行命令来运行/构建(go build
或go run example.go
或go build example.go
)程序时,它会引发错误:
我正在按照cgo 幻灯片编写程序。请让我知道这里的任何错误。
Edit1:我使用的是 OS-X 10.9 操作系统。
Edit2: 之间有一个额外的空格,和之间// export
应该没有空格。但是现在我在构建时收到以下错误://
export
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 似乎非常困难,有人说不可能。
我有哪些选择?