编译成静态链接报错
Closed this issue · 4 comments
QZAiXH commented
首先要声明一下,我对C
并不熟悉。我现在希望将这个项目整合到go
项目中运行,通过cgo
来调用其中的C
函数。现在遇到的问题是在编译go
项目时,需要先将相关代码编译成静态库或动态库。根据文档上所述,执行命令 make ENABLE_STATIC=1
就可以了。但是,在我执行这个命令后报错:
src/hev-misc.h:13:10: fatal error: hev-task.h: No such file or directory
13 | #include <hev-task.h>
| ^~~~~~~~~~~~
compilation terminated.
make: *** [Makefile:74: build/hev-conf.o] Error 1
请问我是哪个步骤出错了?
heiher commented
明白你的意思。编译报错应该是由于没有拉取submodule,git clone需要带--recursive
参数。目前没有支持作为库调用,只能编译为可执行程序运行,ENABLE_STATIC=1
是静态链接成可执行文件。
QZAiXH commented
谢谢你的指导,目前我初步尝试了下,似乎能正常运行。代码如下:
package main
/*
#cgo CFLAGS: -I../third-part/hev-task-system/include -I../third-part/hev-task-system/src/lib/rbtree
#cgo LDFLAGS: -L../third-part/hev-task-system/bin -lhev-task-system -lpthread
#include <stdlib.h>
#include "hev-main.h"
*/
import "C"
import (
"fmt"
"unsafe"
)
func main() {
// 参数数组
args := []string{"natmap", "-s", "turn.cloudflare.com", "-h", "qq.com", "-b", "8081"}
// 创建C风格的参数数组
argc := C.int(len(args))
argv := make([]*C.char, len(args))
for i, arg := range args {
argv[i] = C.CString(arg)
defer C.free(unsafe.Pointer(argv[i])) // 确保在函数结束时释放内存
}
// 调用C函数
ret := C.hev_main(argc, &argv[0])
if ret == 0 {
fmt.Println("调用C函数成功")
} else {
fmt.Println("调用C函数失败")
}
}
我修改了hev-main.h
里的函数名,不然编译会报错说有两个main
函数。
这个main.go
文件需要放到src
目录。
这是执行正常吗?
heiher commented
可以的,执行正常。
QZAiXH commented
太棒了,我将尝试测试是否有bug,如果没有问题将尝试提交个pr让这个库能直接被go当作第三方库调用