【问题标题】:Creating a Haxe hxcpp wrapper for a C library为 C 库创建 Haxe hxcpp 包装器
【发布时间】:2015-12-09 00:04:35
【问题描述】:

几天以来,我一直在尝试为linenoise 编写一个Haxe hxcpp 包装器,它是用C 代码编写的;该库非常简单,并且标头还包含一个外部 C。我正在关注 snowkit linc macro template 但我无法编译 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 的上下文中解决这个问题。

如果我使用包含 hxcpp.h 的 C++ 包装器作为典型的 linc 示例,错误仍然相同,并且我在此处声明的函数 (linenoiseClearScreen) 实际上是一个微不足道的打印语句。

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

【问题讨论】:

  • 它会更容易使用:`#ifdef _cplusplus extern C { #dendif #include #ifdef _cplusplus } #endif
  • linenoise.h 已经有了这样的环境,我想我应该能够将它编译为 C++,但是当我这样做时,我会得到额外的错误(比如通过将 void 指针分配给 char 指针等错误)在);这将需要我修改我想避免的原始库,以使包装器与香草库一起工作。我想知道是否有其他选择。
  • 但是,当我使用 haxe 编译器时,我从未遇到过与 C++ 中的 C 类型相关的最后一个错误; haxe 编译器似乎从未尝试编译我的 C 库
  • haxe 编译器是什么,在哪里可以找到?
  • Haxe 是一种被翻译成 C++ 和其他目标的编程语言。我想在 Haxe 中为 linenoise C 库编写一个包装器。 Haxe 网:haxe.org

标签: c++ c haxe hxcpp


【解决方案1】:

听起来您在设置 hxcpp 的依赖项时缺少一步,在您的情况下为 linenoise。 hxcpp 不知道 .c 文件。

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

不管怎样,我是https://github.com/snowkit/linc_enet 的作者,它是 Hxcpp 的 ENet 绑定。它可能会帮助您将您的设置与更完整的示例进行比较。

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

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

另外,我不建议在绑定中直接通过@:include 包含linenoise.h。 Linc 库在此级别使用间接(参见 linc_enet-root 中的 linc-文件夹)以允许扩展/帮助程序/用于 C++ 端的绑定,而无需触及实际依赖项。

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

【讨论】:

  • 正如您在示例中指出的那样,只要我将 C 文件添加到 XML,它就可以工作了:D 就足够了: 一旦它解决了,它看起来很简单,以至于我自己没有找到它几乎是可耻的。您在哪里找到有关编译器的这些信息?尤其是所有这些 XML 输入?使用 Haxe,我总是遇到找不到信息的问题。完成后,我会将其提交给您的 linc 项目 :)
  • 我从 2009 年开始使用 Haxe,随着时间的推移,我已经习惯了几乎没有文档。有时这很令人沮丧。最后我研究了Hugh Sanderson's blog(hxcpp 的作者)和hxcpp 本身,这实际上只是一个neko-script 解析和设置编译输入。一旦你深入了解它并没有那么复杂。对于未来,您可能想查看 Haxe 的 gitter-channels 和 snowkit-collective(snowkit.org)。那里有很多乐于助人的 Haxers。
  • 学习源代码是终极的学习体验,同意。这也可能是进入 C++ 的一个有趣的项目。但是,这不是不良文档的借口。
  • 这里仅陈述我的学习经历。而且,也没有找任何借口。显然有更好的做法,但现实可能是一个严酷的地方。尤其是当您需要完成工作时。
  • Víctor R. Escobar、FullOfCaffeine 和@MichaelBickel 我将更新空示例以包含它的 c++ 文件,我将添加一些注释部分以获得更快的提示。还值得注意的是,您应该在 linc repo 上发布这些问题,这是最直接地寻求帮助的地方,因此其他人也可以找到它:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 2011-02-06
相关资源
最近更新 更多