如何在Haxe中使用C/C++库(如NCurses)



我有一个用Haxe编写的cli,并通过C++(hxcpp(编译成二进制文件。我想在其中使用ncurses。我在C中使用过ncurses,在Haxe中使用过JS extern,但我不知道如何使用Haxe/C++文档将两者连接在一起。

除了基本的haxe命令(即不构建文件等(,我还没有使用过更多的HXPP编译器,比如:

haxe -lib somelib -cp src --cpp bin/cpp path.to.Main

基本上,我可以处理所有自定义代码,但在外部代码方面很吃力。所以我不完全确定我在实现目标方面还差多少步。但我看到了一些主要障碍。

  1. 如何在构建中包含ncurses?即Makefile中的cc -lncurses -o out [etc...]
  2. 如何包含正确的外部程序,以允许Haxe在没有错误的情况下进行编译。我看到的所有外部示例都涉及类/命名空间,但NCurses函数没有类或命名空间。我还没有找到任何关于纯外部函数的文档
  3. 然后当然是在我实际的haxe代码中正确包含头(或等效的haxe编译(的基础知识

我知道这基本上是在要求一个迷你教程,但我找不到可以用来实现这个特定目标的示例或文档。

谢谢你能提供的任何帮助。

HXCPP使用基于xml的构建系统。当您启动haxe -cp src --cpp bin/cpp path.to.Main:时

  1. Haxe文件被转换到C++,并在输出目录中生成Build.xml,即bin/cpp/Build.xml
  2. 然后一切都由HXPP构建,将新生成的项目Build.xml与全局默认xml定义合并,然后调用编译器工具链

您可以通过@:buildXml元数据注入编译器标志、要链接的库、包含目录等,如手册所述:

@:buildXml("
<target id='haxe'>
<lib name='-lncurses' if='linux'/>
<lib name='ncurses.lib' if='windows'/>
</target>
")
class Main{ ... 

这些标签将附加到项目Build.xml中。haxe目标是默认目标。请记住,每个工具链(MSVC、gcc、Xcode等(都有自己的语法。您可以在build.xml中看到跨平台低级项目(如Systools或Lime(的示例。

您可以将-D HXCPP_VERBOSE添加到haxe命令行中,以查看实际启动了哪些命令:haxe -D HXCPP_VERBOSE -cp src --cpp bin/cpp path.to.Main

至于外部,更简单的情况是:

  1. 您在@:cppFileCode()块中编写C++代码,包含#includes和所需的一切;您在此处编写的所有内容都会原样粘贴到生成的cpp文件中
  2. 将其中一个haxe类上定义的haxe函数标记为@:native("nameOfTheCppFunction"),构建系统将它们连接在一起
@:cppFileCode("
#include <ncurses.h>
void nativeCppTest(){
/* here goes your ncurses code */
return;
}
")
class Main{
public static function main()
{
myCppTest();
}
@:native("nativeCppTest")
extern static function myCppTest():Void;
}

如果打开生成的文件(在本例中为bin/cpp/src/Main.cpp(,您将看到haxemyCppTest()调用已更改为其本机版本nativeCppTest()

如果要传递函数参数并接收返回值,则必须使用cpp.*标准库类型包装这些参数。例如:

@:cppFileCode("
#include <ncurses.h>
void nativeCppTest(const char* myString){
/* here goes your ncurses code */
return;
}
")
class Main{
public static function main()
{
myCppTest("print this");
}
@:native("nativeCppTest")
extern static function myCppTest(myString:cpp.ConstCharStar):Void;
}

有些转换将是自动的(例如,在本例中,从常量字符串到ConstCharStar(,有些转换将需要显式cast;如果需要传递指向C++代码的指针,可以通过cpp.RawConstPointer.addressOf(<haxe object>)(如果不是常量,则为RawPointer(:

public static function main()
{
var myString:String = "print this";
myCppTest(cast cpp.RawConstPointer.addressOf(myString));
}

有用的参考资料:

  • Hugh Sanderson的C++魔术
  • C++外部示例,一个文件中的所有内容(MiniMP3项目(

最新更新