Golang中如何调用C文件

Golang中如何调用C文件 运行代码时遇到以下错误,该如何解决?

错误信息:

add.c:3:1: warning: return type defaults to 'int' [-Wimplicit-int]
 main()
 ^

代码:

add.h 文件

#ifndef _GREETER_H
#define _GREETER_H

int greet(const char *name, int year, char *out);

#endif

add.c 文件

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

int greet(const char *name, int year, char *out) {
    int n;
    
    n = sprintf(out, "Greetings, %s from %d! We come in peace :)", name, year);

    return n;
}

当我编译(gcc -c add.c)时,会出现上述错误。

如何解决这个问题?这个错误是什么意思?

提前感谢


更多关于Golang中如何调用C文件的实战教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

没有,目标文件没有被创建

更多关于Golang中如何调用C文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


当我重启系统后,它工作正常。谢谢

如何获取可用的 GNU C/C++ 工具链

我把相同的代码粘贴到这里。如果我运行其他代码也会出现同样的错误。

错误代码是一个警告,表明函数 main() 没有定义返回类型,默认返回 int 类型,这并不理想。最好明确指定返回类型。但是,在您提供的 add.c 代码清单中,该函数并不在第 3 行,所以要么发生了奇怪的情况,要么您列出的版本与尝试编译的版本不一致。

我尝试了一个示例代码,但它完全没有调用C函数。

代码:

package main

// #include <stdio.h>
//
// void sum(){
//  printf("hello world");
// }
import "C"

import "fmt"
func main() {
fmt.Println("this is before")
        C.sum()
fmt.Println("this is after")
}

当我运行上面的代码时,输出结果是: go run hello.go this is before this is after

这个错误是因为在C代码中,函数声明缺少返回类型。在C语言中,如果函数没有显式指定返回类型,编译器会默认返回类型为int,但现代编译器会对此发出警告。

在你的add.c文件中,main()函数没有指定返回类型。虽然这不是你实际要使用的函数(看起来你主要想用greet函数),但编译器仍然会处理这个函数定义。

解决方案是:

  1. 如果main()函数是测试用的,可以删除它
  2. 或者为main()函数明确指定返回类型

修改后的add.c文件:

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

int greet(const char *name, int year, char *out) {
    int n;
    
    n = sprintf(out, "Greetings, %s from %d! We come in peace :)", name, year);

    return n;
}

// 如果需要main函数,明确指定返回类型
int main() {
    // 测试代码
    return 0;
}

在Go中调用这个C函数的完整示例:

package main

/*
#cgo CFLAGS: -I.
#include "add.h"
*/
import "C"
import (
    "fmt"
    "unsafe"
)

func main() {
    name := C.CString("Gopher")
    defer C.free(unsafe.Pointer(name))
    
    out := make([]byte, 256)
    outPtr := (*C.char)(unsafe.Pointer(&out[0]))
    
    year := 2024
    
    result := C.greet(name, C.int(year), outPtr)
    
    fmt.Printf("Return value: %d\n", result)
    fmt.Printf("Message: %s\n", C.GoString(outPtr))
}

编译步骤:

# 编译C文件(不再有警告)
gcc -c add.c -o add.o

# 或者直接使用go build,它会自动处理C依赖
go build -o main

错误信息return type defaults to 'int'表示编译器检测到函数声明缺少返回类型,自动将其设为int类型。通过明确指定函数返回类型可以消除这个警告。

回到顶部