On Sun, 30 Sep 2018 at 17:55, Simon Ritchie <[email protected]> wrote:
>
> Aagh! I misunderstood the question. Apologies for that.
>
I could have phrased the question more clearly also, sorry.
> There may still be a grain of usefulness in my answer. There are limits to
> the complexity of the C code that you can call with cgo. (It’s even worse if
> you are calling C++, as I was.) You can magic away a lot of those problems
> by writing an extra layer of C that hides the complexities.
>
> However, this probably involves having make around to bind everything
> together. I agree that this is a nuisance, because your user may not have
> make, particularly if they are using Windows. There is a version of gnu make
> available for that, but using it just led me to a different world of pain.
>
I found a workaround finally. Basically:
- in package A, when #including f.h via cgo, I add directive #cgo -DA
- in f.h, I only declare the functions if A is defined
#ifdef A
void f();
#endif
- in f.h, I put a pointer to f in a struct.
typedef struct S {
void (*f)();
} S;
this struct def is not guarded by the #ifdef
- I populate the fn pointer in package A at runtime for instances of struct S.
Then in package B
- I pass the *C.S struct to C via cgo function call.
- I #include "f.h" from package A without -DA
- I pass the *C.S struct to C via cgo function call, and get the
function pointers out of it to call.
Everything builds and runs fine without link errors.
> Have you considered having two separate pieces of software, one in C and one
> in Go and linking them together with grpc? That would allow you to ship your
> solution as two binaries.
>
Yes, but in this case the shared C functionality is tiny, <100LOC it
would be a shame. Also, ironically enough, the end goal of the
contorted cgo usage above is to bypass cgo->go at runtime for a very
particular use case which needs it (definitely not recommended in
general). It would be silly to make a thin C shim and distribute
separately as an external C dependency for the purpose of using more
pure Go and less cgo :)
Thanks in any event for your help, it was also informative to me.
Scott
> --
> You received this message because you are subscribed to a topic in the Google
> Groups "golang-nuts" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/golang-nuts/ruLltGrPWBg/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> [email protected].
> For more options, visit https://groups.google.com/d/optout.
--
Scott Cotton
http://www.iri-labs.com
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.