I have created a golang program to pass some values to c program.
I used this example to do so
My simple golang code :
package main
import "C"
func Add() int {
var a = 23
return a
}
func main() {}
Then I compiled this using
go build -o test.so -buildmode=c-shared test.go
My C code :
#include "test.h"
int *http_200 = Add();
When I try to compile it using gcc -o test test.c ./test.so
I get
int *http_200 = Add(); ^ http_server.c:75:17: error: initializer element is not constant
Why I am getting this error? How to initialize that variable properly in my C code.
PS : edited after first comment.
There are a couple of issues here. First is the incompatibility of the types. Go will return a GoInt. Second issues is that the Add() function has to be exported to get the desired header file. If you don't want to change your Go code, then in C you have to use the GoInt which is a long long.
A complete example is:
test.go
package main
import "C"
//export Add
func Add() C.int {
var a = 23
return C.int(a)
}
func main() {}
test.c
#include "test.h"
#include <stdio.h>
int main() {
int number = Add();
printf("%d\n", number);
}
Then compile and run:
go build -o test.so -buildmode=c-shared test.go
gcc -o test test.c ./test.so &&
./test
23
A second example using the GoInt:
test.go
package main
import "C"
//export Add
func Add() int { // returns a GoInt (typedef long long GoInt)
var a = 23
return a
}
func main() {}
test.c
#include "test.h"
#include <stdio.h>
int main() {
long long number = Add();
printf("%lld\n", number);
}
Then compile and run:
go build -o test.so -buildmode=c-shared test.go
gcc -o test test.c ./test.so &&
./test
23
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With