Reputation: 2972
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.
Upvotes: 3
Views: 1134
Reputation: 5696
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
Upvotes: 4