当前位置: 首页 > 网络应用技术

Golang练习记录:C ++功能调用

时间:2023-03-05 20:13:14 网络应用技术

  本文介绍了如何调用Golang中的C ++功能。

  由于工作需求,需要将工具从终端的终端迁移到网络。核心代码是从C ++动态库实现的。另一个部门的同事使用Java实现了一个版本。它是由一个特殊的人管理的,JDK和Tomcat的安装略有麻烦,个人操作还不够。- 首先,我没有研究Java,另一个正在部署麻烦。因此,它决定用Golang实施它。预期的内容是:Golang调用C ++ Dynamic Library;Golang Web服务并集成HTML/CSS资源;(大)前端框架。

  本文主要研究C ++动态库和功能的调用。

  Golang仅支持C语言的汇编。对于C ++的汇编,有两种方法:1。请勿使用类。将功能添加到C -Pier文件中,并将函数声明为格式2。如果出现了类,请使用另一个文件将其封装到C格式函数中。

  没有类文件,但是后缀是cpp:

  有类文件:

  软件包代码:

  使用makefile将上述文件编译到libfoo.so so库中。

  完整的测试代码如下:

  源代码的要点如下:1。需要设置编译参数LDFLAG,并指定了库的位置和名称。在此示例中,当前目录中的libfoo.so是libfoo.so.2。您需要包括相应的标头文件,stdlib.h是免费函数的文件3。嵌入式的C源代码位于袋子的前面,需要为空。4。传递到C函数的记忆。使用C应用程序的应用程序和内存,所有这些都需要手动释放。

  在运行之前,您需要设置动态库路径:

  否则,在运行过程中找不到动态库:

  运行结果如下:

  从上面的结果可以看出,在C中应用的内存与GO中获得的指针相同,即结构中的0x25b2a50.nil是因为未分配字段pname。

  前面的动态库代码不能嵌入GO代码中,因此选择了BAR.H/CPP。测试代码如下:

  源代码点:1。您可以指定带有CFLAGS的标头文件,添加宏定义等。2。在代码中包含所有C源代码。(问题:看来它应该是标头文件。在编译过程中,自动找到相应的实现文件。它在此处包含在此处,这等同于所有源代码中的所有源代码去代码)

  运行结果如下:

  使用此方法,如果修改了C代码,则需要更新包含C代码的GO文件,否则将不会编译。

  已经实践了两种形式的两种形式,每种形式都有自己的功能和使用。对于简单的C语言代码(包括C ++表单中的简单功能),使用嵌入式表单将更有效。本文中使用的动态库的示例还需要在运行之前设置为操作路径。当然,动态库可以放在系统目录上,但作者认为这不是正确的路径,并且动态库路径的依赖性将在下面删除。