为 C 库创建 Haxe hxcpp 包装器

Creating a Haxe hxcpp wrapper for a C library

这几天我一直在尝试编写一个 Haxe hxcpp wrapper for linenoise which is programmed in C code; the library is very simple and the header also contains an extern C. I am following the snowkit linc macro template,但我找不到编译 C 模块的方法,而且它 link 与项目的其余部分一起使用,我不确定如何继续。

我可以毫无问题地将代码编译为 C 对象并 link 它与我系统中的 C 可执行文件 (OSX el Capitan) 所以我假设我做错了什么haxe 项目,也许我真的不能 link 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 的上下文中解决它。

如果我像典型的 linc 示例一样使用包含 hxcpp.h 的 C++ 包装器,错误仍然相同,并且我在这里声明的函数 (linenoiseClearScreen) 实际上是一个简单的打印语句。

我还阅读了其他可能性,例如 neko 的 CFFI 以围绕库创建一个包装器(我可能已经在互联网上阅读了所有关于它的内容)但我想保持代码静态 linked 如果可能并与所有 hxcpp 目标兼容。

听起来你在为 hxcpp 设置依赖项时遗漏了一个步骤,在你的例子中是 linenoise。 hxcpp 不知道 .c 文件。

这显然在空模板中缺失,因为没有使用实际依赖项。

无论如何,我是 https://github.com/snowkit/linc_enet 的作者,ENet for hxcpp 的绑定。将您的设置与更完整的示例进行比较可能会有所帮助。

在这种情况下,ENet 作为依赖项被设置为 lib 文件夹中的特殊 hxcpp git 子模块。 它可以作为本机工具包的一部分在此处找到:https://github.com/native-toolkit/enet

您应该查看 2 个 xml 文件 defines.xmlfiles.xml。它们基本上描述了 hxcpp 的依赖关系。您可以从字面上复制粘贴这些内容,调整 linenoise 的定义和文件列表。

此外,我不建议直接通过 @:include 在绑定中包含 linenoise.h。 Linc 库在此级别使用间接寻址(请参阅 linc_enet-root 中的 linc- 文件夹)以允许 extensions/helpers of/for 在 C++ 端绑定而不触及实际的依赖关系。

如果您遵循该概念,请参阅 linc/linc_enet.xml 其中所有内容都捆绑在一起进行编译。