gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:35:24 24 4
gpt4 key购买 nike

我有一个用 Haxe 编写并通过 C++ (hxcpp) 编译为二进制文件的 cli。我想在其中使用 ncurses。我在 C 中使用过 ncurses,在 Haxe 中使用过 JS externs,但我无法找出将两者联系在一起的 Haxe/C++ 文档。

除了基本的 haxe 命令(即不构建文件等),我没有使用更多的 HXCPP 编译器,à la:

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

基本上,我可以使用所有自定义代码,但在外部代码上遇到困难。所以我不完全确定我在实现目标方面还缺少多少步骤。但我可以看到一些主要障碍。

  1. 如何在构建中包含 ncurses? IE。 cc -lncurses -o out [etc...] 在 Makefile 中。
  2. 如何包含适当的 extern 以允许 Haxe 完全无错误地进行编译。我看到的所有外部示例都涉及类/ namespace ,但 NCurses 函数没有类或 namespace 。我还没有找到关于裸外部函数的任何文档。
  3. 当然还有在我的实际 Haxe 代码中正确包含 header (或 haxe 编译等效项)的基础知识。

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

感谢您提供的任何帮助。

最佳答案

HXCPP 使用 xml-based build system .当你启动 haxe -cp src --cpp bin/cpp path.to.Main :

  1. Haxe 文件被转译为 C++ 和 Build.xml在输出目录中生成,即 bin/cpp/Build.xml ;
  2. 一切都由 HXCPP 构建,合并新生成的项目 Build.xmlglobal default xml definitions然后调用编译器工具链。

您可以通过 @:buildXml 注入(inject)编译器标志、要链接的库、包含 目录等。元数据,as described on the manual :

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

这些标签将附加到项目Build.xml . The haxe target is the default target .请记住,每个工具链(MSVC、gcc、Xcode 等)都有自己的语法。您可以在 build.xml of cross-platform low-level projects like Systools 中查看示例或 Lime .

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

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

  1. 你在 @:cppFileCode() 中使用#includes 和所有需要的东西编写你的 C++ 代码堵塞;您在此处编写的所有内容都会按原样粘贴到生成的 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 ),您会看到 haxe myCppTest()调用更改为其 native 版本 nativeCppTest() .

如果您想传递函数参数并接收返回值,则必须将这些 using the cpp.* standard library types 包裹起来.例如:

    @: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));
}

有用的引用:

关于c++ - 如何在 Haxe 中使用 C/C++ 库(如 NCurses),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71043552/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com