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