一尘不染

从C调用Go中的整数除法

go

我可以通过该程序执行整数除法:

package main

import "fmt"

func main() {
 a := 10
 b := 5
    fmt.Println(a/b)
}

然后我在go中编写了一个程序,该程序具有+,-,*和/的功能。我用C语言编写了一个程序,调用了每个函数并执行算术运算。除了除法外,代码工作正常。

具有功能的go文件是:(calc.go)

package main

func Add(a, b int) int {
    return a + b
}
func Sub(a, b int) int {
    return a - b
}
func Mul(a, b int) int {
    return a * b
}
func Div(a, b int) int {
    return a / b
}

调用这些函数的C程序是:(calcc.c)

#include <stdio.h>

extern int go_add(int, int) __asm__ ("main.Add");
extern int go_sub(int, int) __asm__ ("main.Sub");
extern int go_mul(int, int) __asm__ ("main.Mul");
extern int go_div(int, int) __asm__ ("main.Div");

int menu()
{
  int op;
  printf("\n1 add");
  printf("\n2 sub");
  printf("\n3 mul");
  printf("\n4 div");
  printf("\nEnter your choice : ");
  scanf("%d", &op);
  return op;
}
int main() {


  int op, ch, result, a, b;

  do{ 
    op= menu();

    printf("First number  : ");
    scanf("%d", &a);
    printf("Second number : ");
    scanf("%d", &b);

    switch(op)
    {
       case 1:
        result = go_add(a, b);
    printf("Result : %d" , result);
        break;
       case 2:
        result = go_sub(a, b);
    printf("Result : %d" , result);
        break;
       case 3:
        result = go_mul(a, b);
    printf("Result : %d" , result);
    break;
       case 4:
        result = go_div(a, b);
    printf("Result : %d" , result);
    break;
       default:
        printf("Invalid choice ! ");
    }
    printf("\nAnother operation? (1 if yes) : ");
    scanf("%d", &ch);
  } while(ch==1);
  printf("\nThank you!");
}

我在终端上使用以下命令进行了编译:

gccgo -c calc.go

gcc calc.o calcc.c -o main

并得到此错误:未定义对__go_runtime_error的引用collect2:错误:ld返回1退出状态

我该如何解决?


阅读 205

收藏
2020-07-02

共1个答案

一尘不染

您需要使用gccgo而不是normal 链接gcc。普通的gcc不知道应该链接到go运行时(libgo)。

根据您的配置,您可能还需要指定可以在哪里找到运行时库。例如,通过将其静态嵌入或使其在LD_LIBRARY_PATH环境变量中可用。例:

gccgo -static-libgo calc.o calcc.o -o main

有关更多信息,请检查设置和使用gccgo

2020-07-02