Создание оболочки Haxe hxcpp для библиотеки C

Пару дней я пытаюсь написать обертку Haxe hxcpp для linenoise, которая запрограммирована в C-коде; библиотека очень проста, а заголовок также содержит внешний C. Я следую шаблону макросов snowkit linc, но не могу найти способ компилировать модуль C и связать его с остальной частью проекта, я не уверен как продолжить.

У меня нет проблем, чтобы скомпилировать код как объект C и связать его с исполняемым файлом C в моей системе (OSX el Capitan), поэтому я предполагаю, что я делаю что-то не так в моем haxe-проекте, возможно, я не могу действительно связать hxcpp с C библиотека, использующая непосредственно процесс сборки из haxe, или я должен передать ее вручную, написав для каждой руки команды.

@: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

Недавно я получаю эту ошибку:

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)

Я знаю, что эта ошибка имеет несколько упоминаний, но я не уверен, как решить эту проблему в контексте haxe hxcpp.

Если я использую оболочку C++, включая hxcpp.h, в качестве типичного примера linc, ошибка все та же, и функция, которую я здесь заявляю (linenoiseClearScreen), на самом деле является тривиальным оператором print.

Я также читал о других возможностях, таких как CFFI для neko, для создания оболочки вокруг библиотеки (возможно, я читал об этом все в Интернете), но я хотел, чтобы код оставался статичным, если это возможно, и был совместим со всеми целями hxcpp.

1 ответ

Решение

Похоже, вы пропустили шаг при настройке зависимостей для hxcpp, в вашем случае linenoise. hxcpp не знает о.c-файле.

Это очевидно отсутствует в пустом шаблоне, так как не используется фактическая зависимость.

В любом случае, я являюсь автором https://github.com/snowkit/linc_enet, привязки для ENet для hxcpp. Это может помочь вам сравнить ваши настройки с более полным примером, подобным этому.

В этом случае ENet, как зависимость, настраивается как специальный подмодуль hxcpp git внутри lib-папки. Его можно найти здесь как часть нативного инструментария: https://github.com/native-toolkit/enet

То, что вы должны посмотреть, это 2 xml-файла defines.xml а также files.xml, Они в основном описывают зависимость для hxcpp. Вы можете буквально копировать и вставлять их, адаптировать определения и список файлов для белья.

Кроме того, я бы не рекомендовал в том числе linenoise.h напрямую через @:include в обязательном порядке. Linc-библиотеки используют косвенное обращение на этом уровне (см. lincпапка в linc_enet-root) для разрешения расширений / помощников / для привязки на стороне C++, не затрагивая реальных зависимостей.

Если вы следуете этой концепции, см. linc/linc_enet.xml где все связано для компиляции.

Другие вопросы по тегам