2017-12-19 6 views
0

Ich bin derzeit ein Go-Wrapper für C api schreiben, die Header mit diesem ifdef enthält:Wie verwendet man CGO für Header-Datei mit bedingt Inline-Funktion?

#ifdef __cplusplus 
#define TEST_INLINE inline 
#else 
#define TEST_INLINE 
#endif 

TEST_INLINE int callC_inline(){ 
    return 1; 
} 

Leider Header, kann ich nicht ändern, da es sich um ein Code von Drittanbietern ist. Der Code kompiliert in Ordnung, wenn ich -Wl, - Erlaube-Multiple-Definition Linker übergeben, aber ich denke, es ist eine schlechte Praxis. Also, ich bin daran interessiert, gibt es eine Flagge, die ich an CGO übergeben kann oder Trick zu erfüllen #ifdef __cplusplus Bedingung?

Compilation Ausnahme:

C:\Temp\go-build318595762\cgo_issue\_obj\lib.o: In function `callC_inline': 
./lib.h:11: multiple definition of `callC_inline' 
C:\Temp\go-build318595762\cgo_issue\_obj\main.cgo2.o:D:/work/go/cgo_issue/lib.h:11: first defined here 
collect2.exe: error: ld returned 1 exit status 

main.go:

package main 

//#cgo CFLAGS: -std=gnu99 
//#include "lib.h" 
import "C" 
import "fmt" 

func main() { 
    fmt.Printf("Go call\n") 
    C.callC() 
} 

lib.h:

void callC(); 

#ifdef __cplusplus 
#define TEST_INLINE inline 
#else 
#define TEST_INLINE 
#endif 

TEST_INLINE int callC_inline(){ 
    return 1; 
} 

lib.c:

#include "lib.h" 
#include <stdio.h> 

void callC(){ 
    printf("C call\n"); 
} 
+2

Haben Sie etwas entlang der Linien versuchen '// #cgo CFLAGS: -D__cplusplus'? – tgregory

+0

@tgregory danke für deinen Kommentar! genau das brauche ich! Kannst du es als Antwort posten? –

Antwort

1

Es ist möglich, einige zusätzliche Informationen an cgo über spezielle Kommentare zu übergeben. In diesem Fall // #cgo CFLAGS: -D__cplusplus

Mehr Infos here

Verwandte Themen