Haxe - 生成一个独立的C++可执行文件

3
我编写了一个haxe程序,试图与远程服务器进行通信。我已经成功地编译成了C++目标文件。可执行文件在我的系统上运行得很好。然而,当我尝试在另一台Windows电脑上运行相同的文件时,出现以下错误:
错误:无法加载模块std@socket_init__0
然后,我安装了haxe和hxcpp,这两个软件都能正常工作。我能够运行exe文件。现在我明白了,它依赖于hxcpp。
但是,这仍然没有解决我的问题,因为我想创建一个独立的应用程序。经过一些研究,我找到了一个文件(ExampleMain.CPP),其中包含以下指示,我认为这可能会解决我的问题。然而,我是一个初学者,不太理解。有人可以帮我详细解释一下吗?谢谢
ExampleMain.CPP
这是一个可以用来链接静态版本的示例主程序。 首先,您需要使用以下命令构建标准库的静态版本:
cd $HXCPP/runtime haxelib run hxcpp BuildLibs.xml -Dstatic_link
然后使用以下命令构建应用程序的静态版本(注意:“static_link”前面有一个额外的空格):
haxe -main YourMain -cpp cpp -D static_link
接下来,您需要将上述库与此(或修改过的版本)主程序链接起来。 您可以选择创建一个VisualStudio项目,并从$HXCPP/bin/Windows/(std、regexp、zlib).lib和您的应用程序库中添加这些库。
还要注意,如果您使用-debug标志编译,您的库将具有不同的名称。
在Windows命令行中进行链接(仅对调试版本需要user32.lib):
cl ExampleMain.cpp cpp/YourMain.lib $HXCPP/bin/Windows/std.lib $HXCPP/bin/Windows/zlib.lib $HXCPP/bin/Windows/regexp.lib user32.lib
从其他操作系统,编译+链接命令将不同。以下是Mac OS的一个示例:
g++ ExampleMain.cpp cpp/Test-debug.a $HXCPP/bin/Mac/regexp.a $HXCPP/bin/Mac/std.a $HXCPP/bin/Mac/zlib.a
如果您希望添加这3个以外的其他静态库(例如nme),您需要使用“-Dstatic_link”标志编译它们,并调用其“register_prims”初始化调用。额外静态库的包含需要在链接行中加入该库,并可能需要链接其他依赖项。此外,请注意,静态链接第三方库可能会涉及许可问题。
1个回答

3
我不确定,但似乎你正在执行hxcpp已经为你执行的相同额外步骤。当你编译独立应用程序时,它实际上是独立的,并不依赖于hxcpp本身,但是它依赖于你可能使用的hxcpp标准库。例如,如果你使用正则表达式,你将需要hxcpp中为此而设计的regexp.dll,如你所指出的那样。Haxe标准库在std.dll中,如果你使用了来自zip包的压缩,则zlib也在其中。
如果我没记错的话,默认情况是动态引用这些组件。为了让你的应用程序像你建议的那样独立,你只需将这些dll与你的二进制文件一起复制即可。
如果你想从你的Haxe代码中自动静态链接到这些库组件,只需从cpp.link包中import类型。这会指示hxcpp自动将其库作为编译的一部分带入,将其静态链接到你的二进制文件中,而不是动态链接。无需额外步骤!
简短回答:在您的代码中添加import cpp.link.StaticStd;和链接包中的其他库组件。只要导入了它,它可以放在任何地方,并将被链接。

我尝试在不同的Linux机器上运行与https://code.haxe.org/category/beginner/hello-world.html 相关的Haxe HelloWorld(使用相同的处理器架构x86_64),但是出现了以下错误:./HelloWorld:/lib/libstdc++.so.6:找不到版本“GLIBCXX_3.4.21”(需要./HelloWorld)我尝试添加您提到的导入,但它没有改变任何内容。您能帮助我吗?谢谢! - kaefert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接