2015-12-09 6 views
5

seit ein paar Tagen versuche ich eine Haxe hxcpp Wrapper für linenoise schreiben, die in C-Code programmiert ist; Die Bibliothek ist sehr einfach und der Header enthält auch ein externes C. Ich bin der snowkit linc macro template folgt, aber ich bekomme keine Möglichkeit, das C-Modul zu kompilieren und dass es mit dem Rest des Projekts verknüpft, ich bin mir nicht sicher, wie es weiter geht .Erstellen eines Haxe hxcpp Wrapper für eine C-Bibliothek

Ich habe keine Probleme, den Code als C-Objekt zu kompilieren und es mit einer C-ausführbaren Datei in meinem System (OSX el Capitan) zu verbinden, also nehme ich an, dass ich in meinem haxe Projekt etwas falsch mache, vielleicht kann ich nicht wirklich Verknüpfen Sie hxcpp mit einer C-Bibliothek, indem Sie direkt den Build-Prozess von haxe verwenden, oder ich sollte es manuell pipen, indem Sie die Befehle per Hand schreiben.

@:keep 
@:structAccess 
@:include('linenoise.h') 
#if !display 
@:build(linc.Linc.touch()) 
@:build(linc.Linc.xml('linenoise')) 
#end 

extern class LineNoise { 
@:native("linenoiseClearScreen") 
static function linenoiseClearScreen(): Void; 
} //LineNoise 

Vor kurzem bin ich immer diese Fehlermeldung:

g++ -o Test-debug -stdlib=libstdc++ -framework Cocoa -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk -m64 @/Users/vresko/projects/linenoise/test/cpp/obj/darwin64-debug/all_objs 

Undefined symbols for architecture x86_64: 

"_linenoiseClearScreen", referenced from: 

Test_obj::main() in ab184b9a_Test.o 

ld: symbol(s) not found for architecture x86_64 

clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Ich bin mir bewusst, dass dieser Fehler mehrere hat erwähnt, aber ich bin nicht sicher, wie das von haxe hxcpp im Kontext zu lösen.

Wenn ich eine C++ - Wrapper einschließlich der hxcpp.h als das typische Beispiel Linc verwenden, ist der Fehler immer noch der gleiche, und die Funktion, die ich hier deklariere (LinenoiseClearScreen) ist eigentlich eine triviale Druckanweisung.

Ich lese auch über andere Möglichkeiten wie CFFI für Neko, um einen Wrapper um die Bibliothek zu erstellen (ich habe alles im Internet darüber gelesen), aber ich wollte den Code statisch verknüpft halten, wenn möglich und kompatibel mit allen hxcpp Ziele.

+1

wäre es viel einfacher zu bedienen sein: '#ifdef _cplusplus extern C {#dendif # include #ifdef _cplusplus} #endif – user3629249

+1

Die [linenoise.h] (https://github.com/antirez/linenoise/blob/master/linernoise.h # L42) hat schon diese Umgebung, ich nehme an, ich sollte in der Lage sein, es als C++ zu kompilieren, aber wenn ich das mache, bekomme ich zusätzliche Fehler (wie Fehler, indem ich einen void Zeiger auf char pointer anwähle); das würde erfordern, dass ich die ursprüngliche lib ändere, die ich vermeiden möchte, um den Wrapper mit einer Vanilla-Bibliothek arbeiten zu lassen. Ich frage mich, ob es dafür eine zusätzliche Option gibt. –

+1

Wenn ich jedoch den haxe-Compiler benutze, habe ich nie die letzten Fehler in Bezug auf die C-Typen in C++ gefunden; Der haxe-Compiler scheint nie zu versuchen, meine C-Bibliothek zu kompilieren –

Antwort

6

klingt wie Sie fehlen ein Schritt beim Einrichten Ihrer Abhängigkeiten für hxcpp, in Ihrem Fall Linenoise. hxcpp kennt die .c-Datei nicht.

Dies fehlt offensichtlich in der leeren Vorlage, da keine tatsächliche Abhängigkeit verwendet wird.

Wie auch immer, ich bin der Autor von https://github.com/snowkit/linc_enet, die Bindung für ENet für hxcpp. Es kann Ihnen helfen, Ihre Konfiguration mit einem vollständigeren Beispiel wie diesem zu vergleichen.

In diesem Fall wird ENet als Abhängigkeit als spezielles hxcpp git Submodul im lib-Ordner eingerichtet. Es kann hier als Teil des mutter Toolkit zu finden: https://github.com/native-toolkit/enet

Was Sie sind die defines.xml und files.xml 2 xml-Dateien suchen soll. Sie beschreiben im Grunde die Abhängigkeit für hxcpp. Sie können diese kopieren, die Definitionen und die Liste der Dateien für linernoise anpassen.

Auch würde ich nicht empfehlen, einschließlich linenoise.h direkt über @:include in der Bindung. Linc-Bibliotheken verwenden eine Indirection auf dieser Ebene (siehe linc -Ordner in der linc_enet -root), um Erweiterungen/Helfer von/für die Bindung auf der C++ - Seite zuzulassen, ohne die tatsächlichen Abhängigkeiten zu berühren.

Wenn Sie diesem Konzept folgen, siehe linc/linc_enet.xml, wo alles für die Kompilierung gebunden ist.

+0

Sobald ich die C-Datei zum XML hinzugefügt habe, wie Sie in Ihrem Beispiel gezeigt haben, hat es funktioniert: D Es war genug damit: Sobald es gelöst ist, sieht es so einfach aus, dass es fast beschämt ist, es nicht alleine zu finden. Wo haben Sie diese Informationen über den Compiler gefunden? Vor allem all diese XML-Eingaben? Mit Haxe habe ich immer das Problem, die Information nicht zu finden. Wenn es fertig ist, schicke ich es an Ihr Linc-Projekt :) –

+0

Ich bin froh, dass Sie es geschafft haben, es zu arbeiten. –

+2

Ich benutze Haxe seit 2009 und im Laufe der Zeit habe ich mich daran gewöhnt, wenig bis keine Dokumentation zu haben. Es war manchmal ziemlich frustrierend. Am Ende habe ich [Hugh Sandersons Blog] (http://gamehaxe.com/tag/hxcpp) (Autor von hxcpp) und hxcpp selbst studiert, was wirklich nur ein Neko-Skript ist, das die Eingaben für die Kompilierung analysiert und einrichtet. Es ist nicht so komplex, wenn du erst einmal hineinbohrst. Für die Zukunft könnt ihr euch die gitter-Kanäle von Haxe und das Snowkit-Kollektiv (snowkit.org) anschauen. Es gibt viele hilfreiche Haxers dort. –

Verwandte Themen