我可以通过该程序执行整数除法:
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退出状态
我该如何解决?
您需要使用gccgo
而不是normal 链接gcc
。普通的gcc不知道应该链接到go运行时(libgo)。
根据您的配置,您可能还需要指定可以在哪里找到运行时库。例如,通过将其静态嵌入或使其在LD_LIBRARY_PATH
环境变量中可用。例:
gccgo -static-libgo calc.o calcc.o -o main
有关更多信息,请检查设置和使用gccgo。
问题内容: 我正在尝试创建一个用Go语言编写的静态对象,以与C程序(例如内核模块等)进行接口。 我已经找到了有关从Go调用C函数的文档,但是关于如何走另一条路却找不到很多。我发现这是可能的,但很复杂。 这是我发现的: 有关C和Go之间的回调的博客文章 CGO文档 Golang邮件列表帖子 有任何人对此有经验吗?简而言之,我正在尝试创建一个完全用Go编写的PAM模块。 问题答案: 您可以从C调用Go
问题内容: 您好Go Lang和C#专家, 美好的一天。我想问你们是否有人尝试过Go程序调用C#DLL函数(类库类型)? 我进行了一些初步研究,并看到了以下文章: 但是这些都是从C Win32实现中创建的DLL。我尝试搜索加载到Go程序中的C#DLL,所有这些都会告诉您在Go程序上调用它之前,您需要具有C ++ / C(Win32)包装器。 另外,上面的链接将告诉您Go认为我认为是“ C”声明(类
问题内容: 我可以在下面从C中调用不带参数的Go函数。通过编译并打印 main.go 文件1.c 现在,我想将字符串/字符数组从C传递给GoFunction。 根据cgo文档中的 “对Go的C引用”,这是可能的,因此我向GoFunction添加了一个字符串参数,并将char数组传递给GoFunction: main.go 文件1.c 当我收到此错误: 其他参考:( 信誉不足,无法发布3个链接)根据
问题内容: 是否可以从Go调用静态对象(.so)文件?我一直在搜寻Google,我不断提出我可以做到的主张 但是尝试这样做会出现错误 并搜索Godocs,但在syscall包中找不到对此功能的引用。是否可以加载库并调用其函数? 问题答案: 在POSIX平台上,您可以用来调用dlopen和朋友:
cgo不仅仅支持从Go调用C,它还同样支持从C中调用Go的函数,虽然这种情况相对前者较少使用。 //export GoF func GoF(arg1, arg2 int, arg3 string) int64 { } 使用export标记可以将Go函数导出提供给C调用: extern int64 GoF(int arg1, int arg2, GoString arg3); 下面让我们看看它是
从这里开始,将深入挖掘关于运行时库部分对于cgo的支持。还记得前面那个test.go吗?这里将继续以它为例子进行分析。 从Go中调用C的函数test,cgo生成的代码调用是runtime.cgocall(_cgo_Cfunc_test, frame): void ·_Cfunc_test(struct{uint8 x[8];}p) { runtime·cgocall(_cgo_1b9ecf7f7