2016-07-05 15 views
1

ich nur eine sehr einfache Demo schreiben zu testen, die gemeinsam benutzte Bibliothek mit CGO (golang) laden .the Code wie folgt:CGO (golang): Fehler: underfined Verweis auf 'Hallo'

xxx.h

#pragma once 
void myprint(const char *str); 

xxx.c

#include "xxx.h" 
#include <stdio.h> 
void myprint(const char *str) { 
    printf("%s\n",str); 
} 

build Shared Library:

gcc -fPIC -shared xxx.c -o libxxx.so 

ok, von hier ist alles in Ordnung.

jetzt, verwenden Sie die CGO die libxxx.so laden und verwenden Sie die myprint Funktion:

package main 

/* 
#include <stdio.h> 
#cgo linux CFLAGS: -I../../include 
#cgo linux LDFLAGS: -L../../lib/linux -lxxx 
#include "xxx.h" 
*/ 
import "C" 

funct main() { 
    C.myprint(C.CString("xxx")) 
} 

dann bauen die Go-Demo:

go build test.go 

wie mein Titel zeigen:

error: undefined reference to 'myprint' 

ich stelle sicher, dass der pfad von lib/head datei richtig ist, wer kann mir helfen, th zu finden Der Grund? Danke.

Antwort

1

Relative Pfade funktionieren im Build-Kontext nicht, da der Build in einem anderen Verzeichnis als die Quelldateien erfolgt.

Sie haben ein paar Möglichkeiten absolute Pfade zu bieten:

  • Sie absolute Pfade in Ihrer Quelle
  • Sie können absolute Pfade verwenden können
  • bieten pkg-config können Sie die CGO_CFLAGS verwenden und CGO_LDFLAGS Umgebungsvariablen
  • Sie können die ${SRCDIR} Variable in den #cgo Zeilen in Ihrer Quelle verwenden.

Siehe cgo documentation für weitere Details

+0

Ich benutze absolute Pfade in meiner Quelle oder verwenden Sie die '$ {SRCDIR}' Variable in der '# cgo' die Info zeigen:' malformed #cgo argument' – FreeApe

+0

@ FreeApe: "missformed #cgo argument" ist eine fehlerhafte Zeile, wie es heißt, oder du benutzt eine sehr alte Version von Go. Bitte aktualisiere das zuerst und füge ein aktuelles Beispiel in deine Frage ein, falls es noch ein Problem gibt. – JimB

+0

thx, dass du gesagt hast, ist richtig. [https://github.com/golang/go/issues/11868](https://github.com/golang/go/issues/11868), und ich versuche, die neueste Version zu testen, es funktioniert. – FreeApe