几天以来,我试图为Haxe编写一个linenoise hxcpp包装器,该包装器是用C代码编写的;该库非常简单,并且 header 中还包含一个externC。我正在按照snowkit linc macro template进行操作,但无法编译C模块,并且该模块与项目的其余部分链接,因此我不确定如何继续。

我没有问题可以将代码编译为C对象并将其与系统中的C可执行文件(OSX el Capitan)链接,所以我认为我在haxe项目中做错了什么,也许我无法真正将hxcpp与a 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上下文中解决该错误。

如果我使用包含hxcpp.h的C++包装器作为典型的linc示例,则错误仍然相同,并且我在这里声明的功能(linenoiseClearScreen)实际上是一个琐碎的print语句。

我还了解了其他可能性,例如CFFI for neko在库周围创建包装器(我可能已经在网上阅读了有关它的所有内容),但我想尽可能保持代码静态链接并与所有hxcpp目标兼容。

最佳答案

听起来好像在为hxcpp设置依赖项时缺少步骤(对于您的情况是linenoise)。 hxcpp不知道.c文件。

由于没有使用实际的依赖关系,因此在空模板中显然缺少此功能。

无论如何,我是https://github.com/snowkit/linc_enet的作者,https://github.com/native-toolkit/enet是hxcpp的ENet的绑定(bind)。它可以帮助您将设置与类似这样的更完整的示例进行比较。

在这种情况下,ENet作为依赖项,被设置为lib文件夹内的特殊hxcpp git子模块。
可以在本地工具包中找到它:ojit_a

您应该看的是2个xml文件defines.xmlfiles.xml。他们基本上描述了hxcpp的依赖关系。您可以从字面上复制并粘贴它们,调整定义和文件列表以消除线噪声。

另外,我不建议直接通过linenoise.h在绑定(bind)中包括@:include。 Linc库在此级别使用间接寻址(请参阅linc -root中的linc_enet -folder),以允许C++方面的绑定(bind)扩展/帮助/绑定(bind),而无需涉及实际的依赖项。

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

10-01 14:25