首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用SWIG和外部C库构建go问题

使用SWIG和外部C库构建go问题
EN

Stack Overflow用户
提问于 2019-06-01 02:54:40
回答 1查看 486关注 0票数 3

我正在尝试创建一个golang程序,它将使用外部C库。在做复杂的事情之前,我想在一个小的foo例子中测试一下SWIG的用法。我还希望能够使用"go get“语法,而不必手动运行swig。并考虑到外部C库应该是以前构建过的,并且可以位于机器上的任何位置。

我使用的是golang 1.12.5和swig 3.0.12

我创建了以下结构:

代码语言:javascript
运行
复制
.
|-- libfoo
|   |-- foo.c
|   |-- foo.h
|   `-- libfoo.so
`-- src
    |-- example_test.go
    |-- lib.go
    `-- libfoo.swig

在libfoo文件夹中,我有一个简单的共享库。这些文件包含: foo.c:

代码语言:javascript
运行
复制
#include "foo.h"

int foo(int c){
    return c+1;
};

foo.h

代码语言:javascript
运行
复制
int foo(int c);

我已经编译过了:

代码语言:javascript
运行
复制
gcc -o ./libfoo.so -fPIC -shared ./foo.c

然后是golang文件: libfoo.swig

代码语言:javascript
运行
复制
%module libfoo

%{
  extern int foo(int a);
%}

extern int foo(int a);

lib.go

代码语言:javascript
运行
复制
package libfoo

/*
#cgo LDFLAGS: -L../libfoo -lfoo
*/

import "C"

最后是example_test.go

代码语言:javascript
运行
复制
package libfoo

import (
    "testing"
    "fmt"
)

func TestFoo(*testing.T) {
    i := Foo(1)
    fmt.Printf("%v\n",i)
}

当我尝试使用"go build -x“进行构建时,似乎没有考虑到位于"lib.go”文件中的cgo指令,因为我在输出中看不到该标志。以下是输出

代码语言:javascript
运行
复制
06aa7e308d6:/mnt/data/src# go build -x
WORK=/tmp/go-build551116655
mkdir -p $WORK/b001/
swig -version
cd $WORK
/opt/go/pkg/tool/linux_amd64/compile -o ./b001/_go_.o -trimpath ./b001 -p main -complete -goversion go1.12.5 -D _$WORK -c=4 ./swig_intsize.go
cd /mnt/data/src
swig -go -cgo -intgosize 64 -module libfoo -o $WORK/b001/libfoo_wrap.c -outdir $WORK/b001/ libfoo.swig
CGO_LDFLAGS='"-g" "-O2"' /opt/go/pkg/tool/linux_amd64/cgo -objdir $WORK/b001/ -importpath _/mnt/data/src -- -I $WORK/b001/ -g -O2 ./lib.go $WORK/b001/_libfoo_swig.go
cd $WORK
gcc -fno-caret-diagnostics -c -x c - || true
gcc -Qunused-arguments -c -x c - || true
gcc -fdebug-prefix-map=a=b -c -x c - || true
gcc -gno-record-gcc-switches -c -x c - || true
cd $WORK/b001
TERM='dumb' gcc -I /mnt/data/src -fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=$WORK/b001=/tmp/go-build -gno-record-gcc-switches -I ./ -g -O2 -o ./_x001.o -c _cgo_export.c
TERM='dumb' gcc -I /mnt/data/src -fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=$WORK/b001=/tmp/go-build -gno-record-gcc-switches -I ./ -g -O2 -o ./_x002.o -c lib.cgo2.c
TERM='dumb' gcc -I /mnt/data/src -fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=$WORK/b001=/tmp/go-build -gno-record-gcc-switches -I ./ -g -O2 -o ./_x003.o -c _libfoo_swig.cgo2.c
TERM='dumb' gcc -I /mnt/data/src -fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=$WORK/b001=/tmp/go-build -gno-record-gcc-switches -I ./ -g -O2 -o ./_x004.o -c libfoo_wrap.c
TERM='dumb' gcc -I /mnt/data/src -fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=$WORK/b001=/tmp/go-build -gno-record-gcc-switches -I ./ -g -O2 -o ./_cgo_main.o -c _cgo_main.c
cd /mnt/data/src
TERM='dumb' gcc -I . -fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=$WORK/b001=/tmp/go-build -gno-record-gcc-switches -o $WORK/b001/_cgo_.o $WORK/b001/_cgo_main.o $WORK/b001/_x001.o $WORK/b001/_x002.o $WORK/b001/_x003.o $WORK/b001/_x004.o -g -O2
# _/mnt/data/src
/tmp/go-build551116655/b001/_x004.o: In function `_wrap_foo_libfoo_0f106433f15c8754':
/tmp/go-build/libfoo_wrap.c:255: undefined reference to `foo'
collect2: error: ld returned 1 exit status

如果我使用环境变量设置CGO_LDFLAGS,它就可以工作。然而,我希望能够只使用"go get“,而不需要之前的那些变量。

我不明白为什么go不考虑我的#cgo指令。我错过了什么吗?

EN

回答 1

Stack Overflow用户

发布于 2019-06-02 03:33:17

golang github repository上有人解决了我的问题

解决方案是删除import "C“指令和包含#cgo指令的注释之间的换行符。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56400400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档