标签: cgo

CGO 中的 golang 结构体与 C 结构体

我将使用cgo将一个c库包装为go库以供项目使用。我看了文档,好像使用cgo有很多规则。我不知道这是否合法。

LibCtx 和 Client 都是 C 中的结构体。这是将 C 结构体放入 golang 结构体中的合法方法吗?

//DBClientLib.go

type DBClient struct {
    Libctx C.LibCtx
    LibClient C.Client
}

func (client DBClient) GetEntry(key string) interface{} {

    //...
}
Run Code Online (Sandbox Code Playgroud)

go cgo

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

Golang:CGO移植包的多重定义

我有2个项目,第一个,名称为A,有一个子模块a导入sqlite3( github.com/mattn/go-sqlite3)。另一个B项目导入的A子模块a,并且在另一个子模块中b,它也导入相同的sqlite3。

并将导入放在 dir 下A(由 管理)。我的 Golang 版本是.Bvendorgovendorgo version go1.12 linux/amd64

在构建Bgo build main.go)时,抛出以下错误(太多,部分错误):

 /usr/local/go/pkg/tool/linux_amd64/link: running gcc failed: exit status 1
 /tmp/go-link-281256755/000029.o: In function `callbackTrampoline':
 /tmp/go-build/_cgo_export.c:25: multiple definition of `callbackTrampoline'
 /tmp/go-link-281256755/000005.o:/tmp/go-build/_cgo_export.c:25: first defined here
 /tmp/go-link-281256755/000029.o: In function `stepTrampoline':
 ...
 /home/xxx/go/src/gitlab.xxxxxxxxx.com/xxxxxxxxx-tools/A/vendor/github.com/mattn/go-sqlite3/sqlite3.go:129: multiple definition of `_sqlite3_result_text'
 /tmp/go-link-281256755/000009.o:/home/xxx/go/src/gitlab.xxxxxxxxx.com/xxxxxxxxx-tools/A/vendor/github.com/mattn/go-sqlite3/sqlite3.go:129: first defined here
 /tmp/go-link-281256755/000033.o: In function `_sqlite3_result_blob':
 ...
Run Code Online (Sandbox Code Playgroud)

但建筑A效果很好。为了测试错误,我开始关注演示,也使用vendor …

linker go cgo

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

如何在 Go 中访问 C 位域

我有一个像这样的结构:

typedef struct st_MASK_SETTINGS
{
  uint32_t foo  : 1;
  uint32_t bar  : 7;
} MASK_SETTINGS
Run Code Online (Sandbox Code Playgroud)

现在我想通过 cgo 访问foo- 但找不到任何文档如何做到这一点。

天真的v := ms.foo抱怨has no field or method

go cgo

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

go/pkg/tool/linux_amd64/link: 运行 gcc 失败: 退出状态 1 /usr/bin/ld: 找不到 -lgdal

我正在尝试利用go build我的资源。

go/pkg/tool/linux_amd64/link: running gcc failed: exit status 1
/usr/bin/ld: cannot find -lgdal
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我的LD_LIBRARY_PATH变量包含/home/fzd/project/lib64文件目录的路径libgdal.so。我的包含具有以下内容的文件PKG_CONFIG_PATH目录的路径:.pc

prefix=/home/fzd/project
exec_prefix=${prefix}
libdir=${prefix}/lib64
deplibdir=${prefix}/lib64
includedir=${prefix}/include

Name: myLibs
Description: Libs
Requires:
Version: v1.0
Libs: -L${deplibdir} -lgdal
Cflags: -I${includedir}
Run Code Online (Sandbox Code Playgroud)

我不知道要检查哪个变量。一切看起来都很好,有趣的是,当我在其他地方克隆我的存储库时,我没有遇到问题(相同LD_LIBRARY_PATH等)

有人知道我可以检查什么吗?

我在CentOS7.6上使用go1.11.1。

linker pkg-config go cgo

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

尝试在cgo中使用dylib动态库失败,报“dyld: Library not returned”

我尝试在cgo中导入dylib动态库,但失败。这是我的代码。

\n\n
package main\n//#cgo CFLAGS: -I./yun2txt/include\n//#cgo LDFLAGS: -L./yun2txt/lib -ltotxt\n//\n//#include <library.h>\nimport "C"\n\nfunc main() {\n    C.hello()\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

也有错误。

\n\n
dyld: Library not loaded: @rpath/libtotxt.dylib\n  Referenced from: /private/var/folders/2n/k70s3c1j08q2z_6kw06n13nh0000gn/T/___go_build_cgo\n  Reason: image not found\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

我该如何解决这个问题\xef\xbc\x9f

\n

rpath dylib go cgo

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

使用 swig 从 C++ 调用 go

我正在使用 swig 将 c++ 与 go 链接起来,但我想在我的 c++ 代码中使用 go 函数。我以前使用过 cgo,并且知道这样的东西会起作用:

//bind.h
extern void GoFunc(*C.char);
void CFunc();
//////////////////


//bind.cc
void CFunc() {
  //do stuff
}
//////////////////


//main.go
package main

//#include "bind.h"
import "C"

//export GoFunc
func GoFunc(*C.char) {
  //do go stuff
}

func main() {
  C.CFunc()
}
//////////////////
Run Code Online (Sandbox Code Playgroud)

但当我尝试在痛饮中复制这一点时,

//bind/bind.i
%module bind
%{
  extern void Foo();
  #include "bar.hpp"
%}

%include <typemaps.i>
%include "bar.hpp"
///////////////////////////


//bind/bar.hpp
class Bar {
  Bar() {}
  void Call() {
    Foo();
  }
};
///////////////////////////


//main.go
package …
Run Code Online (Sandbox Code Playgroud)

c++ swig go cgo

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

在 Go + SWIG + C++ 代码中清理内存管理

我通过 SWIG 使用 Go 的 C++ 库。SWIG 不负责内存管理,因此 Go 端看起来像这样:

f := NewFoo()
defer DeleteFoo(f)
Run Code Online (Sandbox Code Playgroud)

DeleteFoo(f)当我创建 时,调用它很容易f,但对于 C++ 函数的返回值很容易忽略它。

我想自动检查我的代码是否做正确的事情。

我看到 Address Sanitizer 是为 GCC 和 Clang 实现的,这听起来是正确的。但我找不到一个明确的方法来说明如何为我的go test命令启用它。

c++ swig go cgo address-sanitizer

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

Go/Cgo:生成没有 Go 运行时函数定义的静态库

有没有办法从 Go 代码生成 C 静态库,但没有 Go 运行时函数定义

理由

  • Project Ago build -buildmode=c-archive使用,创建一个 C 静态库libA.a
  • 效果很好:project B使用纯 C 语言,能够轻松创建可执行文件,静态链接libA.a,一切都很好。
  • 问题1:project C碰巧也使用Go,但想用作libA.a 常规C库。现在它有一个链接问题:Go 运行时函数(例如eg)_cgo_panic现在在project C运行时(因为它使用Go)和libA.a.
  • 问题2:project D使用纯C,与B相同。但它想使用两个不同的库project A,例如libA.a和一些libA2.a。遗憾的是,它也没有链接,因为 Go 运行时函数现在都在 和 中libA.a定义libA2.a

如果可以生成不包含 Go 运行时定义的库,project C则 和所面临的问题project D可以轻松解决。可以直接链接到. 会链接到,有些会包含所有 Go 运行时内容的定义。project AProject C …

c linker static-libraries go cgo

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

standard_init_linux.go:228: exec 用户进程导致:CGO 项目上没有这样的文件或目录

我有一个引用 C 库的 Go 服务,在尝试运行我的 docker 映像时收到以下错误:

standard_init_linux.go:228: exec user process caused: no such file or directory

这不是standard_init_linux.go:190: exec 用户进程导致“没有这样的文件或目录”的重复 - Docker,因为我没有带有 CR 行结尾的入口点 shell 脚本。该网站上的其他一些人建议CGO_ENABLED=0在编译时进行设置,但我当然不能这样做,因为这是一个 CGO 项目。

C 库安装在和/usr/local/lib/sgp4目录下,其中包含一堆 .so 文件。Linux/IFORTLinux/GFORTRAN

环境变量 LD_LIBRARY_PATH 设置为 /usr/local/lib/sgp4/Linux/IFORT。

在我的项目中,有一组包装器.h文件,CGO注释如下:

去设置

我的 Dockerfile 如下:

FROM [redacted]/alpine-base:3.17

RUN apk update && \
    apk add curl jq

COPY etc/cfg/propagator.properties /usr/local/[redacted]/etc/cfg/
COPY bin/sgp4 /usr/local/[redacted]/bin/sgp4
COPY propagator/wrappers /usr/local/[redacted]/bin/wrappers

# Download library files
RUN mkdir -p /usr/local/sgp4/lib
RUN curl --output /usr/local/sgp4/lib/SGP4.tar …
Run Code Online (Sandbox Code Playgroud)

c go cgo docker dockerfile

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

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

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

package main

import (
    "fmt"
)

/*
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>


using namespace std;

void dosome(){
    vector<int> ivec;   // empty vector
    for (vector<int>::size_type ix = 0; ix != 10; ++ix)
        ivec[ix] = ix; // disaster: ivec has no elements
}

*/
// #cgo LDFLAGS: -lstdc++
import "C"

//import "fmt"
func main() {

    C.dosome()

    var input string
    fmt.Scanln(&input)
}
Run Code Online (Sandbox Code Playgroud)

并在下面有错误消息:

go run stddemo.go 
# command-line-arguments
./stddemo.go:13:10: fatal error: 'vector' file not found
#include …
Run Code Online (Sandbox Code Playgroud)

go cgo

4
推荐指数
1
解决办法
2091
查看次数

标签 统计

cgo ×10

go ×10

linker ×3

c ×2

c++ ×2

swig ×2

address-sanitizer ×1

docker ×1

dockerfile ×1

dylib ×1

pkg-config ×1

rpath ×1

static-libraries ×1