5

几天以来,我正在尝试为用 C 代码编写的linenoise编写Haxe hxcpp 包装器;该库非常简单,头文件还包含一个外部 C。我正在关注snowkit linc 宏模板,但我无法编译 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 目标兼容。

4

1 回答 1

6

听起来您在设置 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 的依赖关系。您可以从字面上复制'n粘贴这些,调整定义和文件列表以适应线噪声。

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

如果您遵循该概念,请查看linc/linc_enet.xml将所有内容捆绑在一起以进行编译的位置。

于 2015-12-10T06:31:42.587 回答