cgo编译出来的文件怎么用?

blackcat242 · 2015-04-03 07:49:29 · 3054 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2015-04-03 07:49:29 的主题,其中的信息可能已经有所发展或是发生改变。

使用cgo编译出来了c代码,然后用go install编译出来了一个.a文件,这个.a文件是静态库么?我用ar把它解压开后,发现如下文件:

-rw-r--r--  1 root   root   397 Apr  3 22:32 __.PKGDEF
-rw-r--r--  1 root   root  6.1K Apr  3 22:32 _all.o
-rw-r--r--  1 root   root  1.4K Apr  3 22:32 _cgo_defun.6
-rw-r--r--  1 root   root   252 Apr  3 22:32 _cgo_import.6
-rw-r--r--  1 root   root   12K Apr  3 22:32 _go_.6

这些文件好像只有_all.o是正常的二进制文件,我尝试在c代码中调用这个静态库,但是报错

linux-80ha:/hdd2/xyl # gcc test.c -L. -ltest -o aa
./libtest.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: error: ld returned 1 exit status

我又用_all.o做成了一个so文件,gcc -shared _all.o -o libtt.so

然后又尝试使用这个so文件,结果还是报错。

linux-80ha:/hdd2/xyl # gcc test.c -L. -ltt
./libtt.so: undefined reference to `_cgoexp_254e33f9fba9_MyFunction'
./libtt.so: undefined reference to `crosscall2'
./libtt.so: undefined reference to `_cgoexp_254e33f9fba9_MyFunction2'
collect2: error: ld returned 1 exit status

这个编译出来的c接口,到底如何使用呢?


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3054 次点击  
加入收藏 微博
4 回复  |  直到 2015-04-06 06:05:17
blov
blov · #1 · 10年之前

.a 结尾的文件,是静态库。目前 Go 还不支持编译为 动态库。

blackcat242
blackcat242 · #2 · 10年之前
blovblov #1 回复

.a 结尾的文件,是静态库。目前 Go 还不支持编译为 动态库。

静态库也不多啊,编译的时候链接这个静态库一样报错,看我贴的第一个报错的就是

qkb_75_go
qkb_75_go · #3 · 10年之前

go语言自己产生的,自己用。 别人想用没门!

别人产生的 dll,so文件,go 是可以用。

这个有个好名字,叫 包纳百川,一点不漏。

blov
blov · #4 · 10年之前
blackcat242blackcat242 #2 回复

#1楼 @blov 静态库也不多啊,编译的时候链接这个静态库一样报错,看我贴的第一个报错的就是

编译成为.a 后,跟普通go包一样使用就行了。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传