初探CGO之go中使用c++库

本文介绍了一个CGO跨语言调用的例子,通过Go语言调用C++编写的动态和静态库。示例中包含了如何编写Makefile来编译C++库,并通过CGO指令指定头文件和库文件的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

建立测试目录

$ mkdir CGO
$ ls
makefile print.cpp print.h use_lib.go
$ cat  makefile
print.a:
	g++ -c print.cpp -o print.o
	ar r libprint.a print.o
print.so:
	g++ -fPIC -c print.cpp -o print.o
	g++ -shared -o libprint.so print.o
clean:
	rm libprint.*

写测试代码

print.h

#ifndef __PRINT_H
#define __PRINT_H

#ifdef __cplusplus
extern "C" {
#endif

extern int Num;
extern void print();

#ifdef __cplusplus
}
#endif

#endif

print.cpp

#include <stdio.h>
#include "print.h"

int Num = 8;

void print() {
	printf("hello cgo, dynamic\n");
}

use_lib.go

package main

/*
// 此处-I指定了头文件的路径
#cgo CFLAGS: -I .
// 此处的路径只是编译时库的连接路径
// 对于动态库,运行时从环境变量的路径加载
#cgo LDFLAGS: -L . -lprint
#include "print.h"
*/
import "C"
import "fmt"

func main() {
	fmt.Println(C.Num)
	C.print()
}

编译

静态库使用

make clean
make print.a
go run use_lib.go

动态库使用

添加当前目录为链接路径

export LD_LIBRARY_PATH=./

编译运行

make clean
make print.so
go run use_lib.go
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值