如何使用cgo静态链接go中的ac库?
因此,该小组中有很多建议您可以随时进行的工作(尽管不在cgo文档中):
package bridgeimport "fmt"
// #cgo CFLAGS: -I/Users/doug/projects/c/go-bridge/include
// #cgo LDFLAGS: /Users/doug/projects/c/go-bridge/build/libgb.a
// #include <junk.h>
import "C"
func Run() {
fmt.Printf("Invoking c library...\n")
C.x(10)
fmt.Printf("Done\n")
}
但是,它似乎不起作用:
/var/folders/.../bridge.a(bridge.cgo2.o)(__TEXT/__text): x: not defined
使用动态库,并检查生成的文件,这似乎可以很好地工作,它实际上在其中带有符号“ x”:
/var/folders/rg/hj4s3qlj3sz1d1b5p50ws0vc0000gn/T/go-build442792776/bridge/_obj/_cgo_.o:0000000100001048 S _NXArgc
0000000100001050 S _NXArgv
0000000100001060 S ___progname
0000000100000dc0 T __cgo_2d7eefe3d6d4_Cfunc_x
0000000100000da0 T __cgo_allocate
0000000100000db0 T __cgo_panic
0000000100000000 T __mh_execute_header
0000000100000d90 T _crosscall2
0000000100001058 S _environ
U _exit
0000000100000d80 T _main
U _puts
0000000100001000 s _pvars
0000000100000de0 T _x <------- Exists
U dyld_stub_binder
0000000100000d40 T start
但显然只是bridge.cgo2.o中的标记:
/var/folders/rg/hj4s3qlj3sz1d1b5p50ws0vc0000gn/T/go-build442792776/bridge.a(bridge.cgo2.o):0000000000000368 s EH_frame0
0000000000000000 T __cgo_2d7eefe3d6d4_Cfunc_x
0000000000000380 S __cgo_2d7eefe3d6d4_Cfunc_x.eh
U _x
我究竟做错了什么?
对于ref,c标头:
int x(int y);
和代码:
#include <junk.h>#include <stdio.h>
int x(int y) {
printf("Hello World\n");
return y;
}
--
编辑:
不,-L和-l也不起作用;实际上,在Google网上论坛上有一些具体讨论,认为该(-l / blah / blah.a)对cgo不起作用,实际上正确的语法
是 省略-l并仅列出.a文件…但是嘿,如果可以的话,我完全会用它。但事实并非如此:
dougs-mini:go doug$ go run test.go# bridge
ld: library not found for -l/Users/doug/projects/c/go-bridge/build/libgb.a
collect2: ld returned 1 exit status
dougs-mini:go doug$ ls -l /Users/doug/projects/c/go-bridge/build/libgb.a
-rw-r--r-- 1 doug staff 872 25 May 14:02 /Users/doug/projects/c/go-bridge/build/libgb.a
详细版本:
dougs-mini:go doug$ go build -work -x test.goWORK=/var/folders/rg/hj4s3qlj3sz1d1b5p50ws0vc0000gn/T/go-build354497708
mkdir -p $WORK/bridge/_obj/
cd /Users/doug/projects/c/go-bridge/go/src/bridge
/Users/doug/projects/go/go/pkg/tool/darwin_amd64/cgo -objdir $WORK/bridge/_obj/ -- -I/Users/doug/projects/c/go-bridge/include -I $WORK/bridge/_obj/ bridge.go
/Users/doug/projects/go/go/pkg/tool/darwin_amd64/6c -FVw -I $WORK/bridge/_obj/ -I /Users/doug/projects/go/go/pkg/darwin_amd64 -o $WORK/bridge/_obj/_cgo_defun.6 -DGOOS_darwin -DGOARCH_amd64 $WORK/bridge/_obj/_cgo_defun.c
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -I/Users/doug/projects/c/go-bridge/include -I $WORK/bridge/_obj/ -o $WORK/bridge/_obj/_cgo_main.o -c $WORK/bridge/_obj/_cgo_main.c
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -I/Users/doug/projects/c/go-bridge/include -I $WORK/bridge/_obj/ -o $WORK/bridge/_obj/_cgo_export.o -c $WORK/bridge/_obj/_cgo_export.c
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -I/Users/doug/projects/c/go-bridge/include -I $WORK/bridge/_obj/ -o $WORK/bridge/_obj/bridge.cgo2.o -c $WORK/bridge/_obj/bridge.cgo2.c
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -o $WORK/bridge/_obj/_cgo_.o $WORK/bridge/_obj/_cgo_main.o $WORK/bridge/_obj/_cgo_export.o $WORK/bridge/_obj/bridge.cgo2.o -l/Users/doug/projects/c/go-bridge/build/libgb.a
# bridge
ld: library not found for -l/Users/doug/projects/c/go-bridge/build/libgb.a
collect2: ld returned 1 exit status
值得注意的是,尝试像这样链接(使用-l)时失败是gcc链接失败的典型原因,因为您尝试合并一组目标文件。
即。这个:
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -o ... -l/path/libgb.a
永远不会在gcc下编译;您 必须 像这样链接静态库:
gcc -I . -g -O2 -fPIC -m64 -pthread -fno-common -o ... /path/libgb.a
即。绝对不是我缺少-l或-L。
回答:
原来我的代码是100%罚款;它是Go 1.0的副本;在go 1.1下可以正常工作。在go 1.0下,它不是。
(我知道回答我自己的问题有点la脚;但是下面的’use -L -l答案也不对;与之无关)。
GitHub上有一个可行的解决方案示例,适用于以后发现此问题的任何人:
https://github.com/shadowmint/go-static-
linking
简而言之:
CGO_ENABLED=0 go build -a -installsuffix cgo -ldflags '-s' src/myapp/myapp.go
另请参阅:https :
//github.com/golang/go/issues/9344
以上是 如何使用cgo静态链接go中的ac库? 的全部内容, 来源链接: utcz.com/qa/416796.html