为C库创建一个Haxe-hxcpp包装器

Creating a Haxe hxcpp wrapper for a C library

本文关键字:一个 Haxe-hxcpp 包装 创建      更新时间:2023-10-16

几天以来,我一直在尝试为linenoise编写一个用C代码编程的Haxe-hxcpp包装器;库非常简单,头中还包含一个extern C。我正在使用snowtkit linc宏模板,但我无法找到编译C模块的方法,而且它与项目的其他部分链接,我不知道如何继续。

我可以将代码编译为C对象,并将其与系统中的C可执行文件(OSX el Capitan)链接,所以我认为我在haxe项目中做错了什么,也许我真的不能直接使用haxe的构建过程将hxcpp与C库链接,或者我应该通过手动编写命令手动将其传输。

@: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(我可能已经读过互联网上关于它的所有内容),但如果可能的话,我想保持代码的静态链接,并与所有hxcpp目标兼容。

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

空模板中显然缺少这一点,因为没有使用实际的依赖项。

不管怎样,我是https://github.com/snowkit/linc_enet,ENet与hxcpp的结合。它可能会帮助您将您的设置与这样一个更完整的示例进行比较。

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

您应该看到的是两个xml文件defines.xmlfiles.xml。它们基本上描述了hxcpp的依赖关系。您可以直接复制和粘贴这些文件,调整linenoise的定义和文件列表。

此外,我不建议在绑定中通过@:include直接包含linenoise.h。Linc库在这个级别上使用间接方式(请参阅linc_enet-根目录中的linc-文件夹),以便在不涉及实际依赖项的情况下,在C++端为绑定提供/的扩展/助手。

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