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

так как пару дней я пытаюсь написать Haxe Оболочка hxcpp для linenoise который запрограммирован в коде C; библиотека очень проста, и заголовок также содержит внешний C. Я следую шаблон макрос сноукайт линк но я не могу найти способ скомпилировать модуль 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), фактически является тривиальным оператором печати.

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

5

Решение

Похоже, вы пропустили шаг при настройке зависимостей для 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 где все связано для компиляции.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]