Haxe - 创建C ++独立可执行文件

时间:2016-12-02 10:52:38

标签: c++ haxe haxelib hxcpp

我编写了一个haxe程序,试图与远程服务器通信。我能够成功编译到C ++目标。可执行文件在我的系统上运行正常。但是,当我尝试在另一个Windows框中运行相同时,它失败并出现以下错误

错误:无法加载模块std @ socket_init__0

然后我安装了haxe和hxcpp,就像魅力一样。我能够运行exe。我现在明白了对hxcpp的依赖。

由于我想创建一个独立的应用程序,这仍然无法解决我的问题。经过一些研究后,我找到了一个文件(ExampleMain.CPP),其中包含以下说明,我认为可能会解决我的问题。但是,我是一个新手,并没有完全遵循。有人可以带我走过这个吗?感谢

ExampleMain.CPP

这是一个可用于链接静态版本的示例主线。  首先,您需要构建标准库的静态版本:

cd $ HXCPP / runtime

haxelib运行hxcpp BuildLibs.xml -Dstatic_link

然后是你的应用程序的静态版本(注意:' static_link'之前的额外空格):

haxe -main YourMain -cpp cpp -D static_link

然后,您需要将上述库与此(或修改版本)main链接起来。  您可以选择创建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

从其他操作系统,compile + link命令会有所不同。这是mac的一个:

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 个答案:

答案 0 :(得分:3)

我不确定,但似乎你正在采取hxcpp为你做的相同的额外步骤。编译独立应用程序时,它实际上是独立的,并且不依赖于hxcpp本身 - 但它依赖于您可能使用过的hxcpp中的标准库。例如,如果您使用正则表达式,则需要hxcpp为其提供的regexp.dll,如您所述。 haxe标准库位于std.dll中,如果你使用zip包中的压缩,则zlib就是。

如果我没有弄错,默认是动态引用这些组件。为了使您的应用程序按照您的建议独立,您只需将这些dll与二进制文件一起复制。

如果您希望从您的haxe代码中静态链接到这些库组件,只需import cpp.link包中的import cpp.link.StaticStd;类型。这指示hxcpp自动将其库作为编译的一部分,将其静态链接到二进制文件而不是动态链接。不需要额外的步骤!

简短回答:将链接包中的public void onClick(View v){ ComponentName mServiceComponent = new ComponentName(this, TestJobService.class); JobInfo.Builder builder = new JobInfo.Builder(kJobId++, mServiceComponent); //Pass Parameter to Job Scheduler PersistableBundle bundle = new PersistableBundle(); bundle.putString(DataDownloadService.EXTRA_PARAM_URL, DataDownloadService.URL); builder.setExtras(bundle) .setPersisted(true); builder.setPeriodic(10000);//10 Seconds builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED); builder.setRequiresDeviceIdle(true); builder.setRequiresCharging(false); is charging or not JobScheduler jobScheduler = (JobScheduler)getApplication().getSystemService(Context.JOB_SCHEDULER_SERVICE); jobScheduler.schedule(builder.build()); } 和任何其他库组件添加到代码中。它可以是任何地方,只要它被导入,它将被链接。