我试图编写一个完全独立的go程序,包括c库。我使用的命令是
[mm17@mm17 grogger]$ go build --ldflags '-extldflags "-static"' ./grogger.go
# command-line-arguments
/usr/bin/ld: cannot find -lgrok
collect2: ld returned 1 exit status
/home/mm17/go/pkg/tool/linux_amd64/6l: running gcc failed: unsuccessful exit status 0x100
所以我将修改调用grok库的文件以获得以下标题
1 package grok
2
3 /*
4 #cgo LDFLAGS: -L /usr/lib/libgrok.so -lgrok
5 #include <grok.h>
6 */
7 import "C"
然后运行相同的命令
[mm17@mm17 grogger]$ go build --ldflags '-extldflags "-static"' ./grogger.go
# github.com/blakesmith/go-grok
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400180
/tmp/go-build731085030/github.com/blakesmith/go-grok/_obj/grok.cgo2.o: In function `_cgo_4244208c3352_Cfunc_strlen':
../../blakesmith/go-grok/grok.go:169: undefined reference to `strlen'
/tmp/go-build731085030/github.com/blakesmith/go-grok/_obj/grok.cgo2.o: In function `_cgo_4244208c3352_Cfunc_grok_patterns_import_from_file':
../../blakesmith/go-grok/grok.go:159: undefined reference to `grok_patterns_import_from_file'
/tmp/go-build731085030/github.com/blakesmith/go-grok/_obj/grok.cgo2.o: In function `_cgo_4244208c3352_Cfunc_grok_pattern_add':
../../blakesmith/go-grok/grok.go:147: undefined reference to `grok_pattern_add'
/tmp/go-build731085030/github.com/blakesmith/go-grok/_obj/grok.cgo2.o: In function `_cgo_4244208c3352_Cfunc_grok_new':
../../blakesmith/go-grok/grok.go:132: undefined reference to `grok_new'
/tmp/go-build731085030/github.com/blakesmith/go-grok/_obj/grok.cgo2.o: In function `_cgo_4244208c3352_Cfunc_grok_match_walk_next':
../../blakesmith/go-grok/grok.go:123: undefined reference to `grok_match_walk_next'
/tmp/go-build731085030/github.com/blakesmith/go-grok/_obj/grok.cgo2.o: In function `_cgo_4244208c3352_Cfunc_grok_exec':
../../blakesmith/go-grok/grok.go:81: undefined reference to `grok_exec'
/tmp/go-build731085030/github.com/blakesmith/go-grok/_obj/grok.cgo2.o: In function `_cgo_4244208c3352_Cfunc_grok_discover_new':
../../blakesmith/go-grok/grok.go:68: undefined reference to `grok_discover_new'
/tmp/go-build731085030/github.com/blakesmith/go-grok/_obj/grok.cgo2.o: In function `_cgo_4244208c3352_Cfunc_grok_compile':
../../blakesmith/go-grok/grok.go:46: undefined reference to `grok_compile'
/tmp/go-build731085030/github.com/blakesmith/go-grok/_obj/grok.cgo2.o: In function `_cgo_4244208c3352_Cfunc_grok_match_walk_init':
../../blakesmith/go-grok/grok.go:108: undefined reference to `grok_match_walk_init'
/tmp/go-build731085030/github.com/blakesmith/go-grok/_obj/grok.cgo2.o: In function `_cgo_4244208c3352_Cfunc_grok_match_walk_end':
../../blakesmith/go-grok/grok.go:99: undefined reference to `grok_match_walk_end'
/tmp/go-build731085030/github.com/blakesmith/go-grok/_obj/grok.cgo2.o: In function `_cgo_4244208c3352_Cfunc_grok_free':
../../blakesmith/go-grok/grok.go:90: undefined reference to `grok_free'
/tmp/go-build731085030/github.com/blakesmith/go-grok/_obj/grok.cgo2.o: In function `_cgo_4244208c3352_Cfunc_grok_discover':
../../blakesmith/go-grok/grok.go:58: undefined reference to `grok_discover'
/tmp/go-build731085030/github.com/blakesmith/go-grok/_obj/grok.cgo2.o: In function `_cgo_4244208c3352_Cfunc_free':
../../blakesmith/go-grok/grok.go:34: undefined reference to `free'
collect2: ld returned 1 exit status
如果我只是尝试正常构建它我也会得到相同的东西:
[mm17@mm17 grogger]$ go build grogger.go
# github.com/blakesmith/go-grok
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400180
/tmp/go-build294631148/github.com/blakesmith/go-grok/_obj/grok.cgo2.o: In function `_cgo_4244208c3352_Cfunc_strlen':
../../blakesmith/go-grok/grok.go:169: undefined reference to `strlen'
....
我确定我只是在做一些愚蠢的事情,但我似乎无法弄明白,当谈到gcc时,我是个新手,这是我的第一个非玩具计划。
答案 0 :(得分:0)
使用GCC编译本机库时,请确保使用-fPIC选项。
如果没有-fPIC编译库,GO将无法在其中找到函数。