在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
今天和同事一起看了一个很诡异的问题,研究了半天发现是由于Go的编译缓存导致的,记录下来方便其他遇到问题的同学参考。 首先编写一个hello.go文件,里面调用了C函数:
对应的libhello.h文件:
以及libhello.c文件:
接下来用go build hello.go编译,执行./hello,输出结果为1,一切正常。 这时候,我们修改libhello.c文件,让hello()函数return 2。然后重新用go build hello.go编译,执行./hello,你会发现,输出结果仍然为1。 显然,cgo没有重新编译修改后的C代码。我们就想,干脆先用gcc编译成静态库,然后Go代码里面链接这个库,这样是不是就可以保证每次都使用最新代码了?于是,代码改成了这个样子:
然后我们先把C代码编译成静态库,再编译Go文件:
接着,我们修改libhello.c文件,让hello()函数return 2。然后重新用go build hello.go编译,执行./hello,不幸的是,输出结果仍然为1。 那么问题到底出在哪里呢?我们在go build的时候加上-x -v参数看看: Google了一下发现,早就有人遇到过这个问题了:https://github.com/golang/go/issues/24355 所以,这个问题有以下两种解决方案:
更多文章欢迎关注“鑫鑫点灯”专栏:https://blog.csdn.net/turkeycock |
请发表评论