C语言动态库,就是在编译的时候使用enable-shared
,最终会生成.so
文件。
此处以 lzo 库为例,他是用C语言写的用来压缩文件的库。以编译的方式来安装。
> cd /usr/local
> wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz
> tar -xzf lzo-2.10.tar.gz
> cd /usr/local/lzo-2.10
> ./configure --enable-shared
> make && make install
从输出的信息看,lzo库被安装在了 /usr/local/lib
将库文件复制至/usr/lib,如果是位系统则是 /usr/lib
> cp /usr/local/lib/*lzo* /usr/lib/
否则会在后续执行lzop命令时出现类似如下的提示 lzop: error while loading shared libraries: liblzo2.so.2: cannot open shared object file: No such file or directory
> ls /usr/lib/*lzo*
/usr/lib/liblzo2.a /usr/lib/liblzo2.la /usr/lib/liblzo2.so /usr/lib/liblzo2.so.2 /usr/lib/liblzo2.so.2.0.0
package main
/*
#cgo LDFLAGS: -llzo2
#include <lzo/lzo1x.h>
*/
import "C"
import "fmt"
func main() {
fmt.Println(uint16(C.lzo_version())) // 8288
}
#cgo LDFLAGS: -llzo2
表示要连接 /usr/lib
下面的liblzo2.so.2
,其中.so.2
为动态库的版本号,它是在库的接口发生变化时更新的
> ls /usr/local/include/lzo
lzo1a.h lzo1b.h lzo1c.h lzo1f.h lzo1.h lzo1x.h lzo1y.h lzo1z.h lzo2a.h lzo_asm.h lzoconf.h lzodefs.h lzoutil.h
我们打开lzo1x.h
文件就可以看到其定义了哪些函数,当然想要用好这个库,我们还是要对它有一定的了解。
./number/number.h
int number_add_mod(int a, int b, int mod);
./number/number.c
#include "number.h"
int number_add_mod(int a, int b, int mod)
{
return (a + b) % mod;
}
生成./number/libnumber.so
cd ./number
gcc -fPIC -shared -o libnumber.so number.c
package main
/*
#cgo LDFLAGS: -L./number -lnumber -Wl,-rpath,number
#include "number/number.h"
*/
import "C"
import "fmt"
func main() {
fmt.Println(C.number_add_mod(3, 2, 2))
}
> go run main5.go
1
如果出现报错
error while loading shared libraries: libnumber.so: cannot open shared object file: No such file or directory
生成静态库
libnumber.so libnumber.xxx
cd ./number
gcc -c -o libnumber.o number.c
ar rcs libnumber.a libnumber.o
生成libnumber.a
静态库之后,我们就可以在CGO中使用该资源了。代码和上面一样,直接运行即可。
package main
/*
#cgo LDFLAGS: -L./number -lnumber -Wl,-rpath,number
#include "number/number.h"
*/
import "C"
import "fmt"
func main() {
fmt.Println(C.number_add_mod(3, 2, 2))
}
> go run main6.go
1
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- ryyc.cn 版权所有 湘ICP备2023022495号-3
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务