因为几天我试图为Haxe写一个linenoise hxcpp包装器,用C代码编程;该库非常简单,标题还包含一个extern 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为neko创建了一个围绕库的包装器(我可能已经在互联网上阅读了所有内容)但是我希望尽可能保持代码静态链接并与所有hxcpp目标兼容
答案 0 :(得分:6)
听起来你在设置hxcpp的依赖项时错过了一个步骤,在你的情况下是linenoise。 hxcpp不知道.c文件。
空模板中显然缺少这个,因为没有使用实际依赖项。
无论如何,我是https://github.com/snowkit/linc_enet的作者,是针对hxcpp的ENet的绑定。它可能会帮助您将您的设置与更完整的示例进行比较。
在这种情况下,ENet作为依赖项被设置为lib-folder中的特殊hxcpp git子模块。 它可以在本地作为native-toolkit的一部分找到:https://github.com/native-toolkit/enet
您应该看到的是2个xml文件defines.xml
和files.xml
。它们基本上描述了hxcpp的依赖性。你可以直接复制'粘贴那些,修改linenoise文件的定义和列表。
此外,我建议不要直接通过linenoise.h
在绑定中加入@:include
。 Linc-libraries在此级别使用间接(请参阅linc
- root中的linc_enet
- 文件夹)以允许C ++的绑定的扩展/帮助程序,而不触及实际的依赖项
如果您遵循该概念,请参阅linc/linc_enet.xml
,其中所有内容都捆绑在一起进行编译。