Engee 文档
Notebook

使用GCC在Engee中编译C代码

Engee平台的内置工具中,还有用于处理生成代码的工具。 在这个例子中,我们将学习如何编译代码并从Engee脚本调用它。

有关在Engee环境中执行外部程序的更多信息,请参阅[文档](https://engee.com/helpcenter/stable/julia/manual/running-external-programs.html )。

Engee中的编译工具

Engee使用Engee独有的库和工具,在与Unix兼容的内核上执行模型和程序。 操作系统内核的交付中包含了足够多的第三方工具,这使得创建特定的自定义软件开发和测试路径和模型成为可能。

Engee中,工程师可以使用标准Unix内核包中的许多工具,例如:

  • gcc -C代码编译器
  • g++ -C++代码编译器

除了这些,该软件包通常包含许多用于不同编程语言(python,perl)的额外实用程序和解释器。..).

让我们运行下面的单元格来找出编译器版本。 gcc (并在同一时间检查其性能):

In [ ]:
;gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/12/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 12.2.0-14' --with-bugurl=file:///usr/share/doc/gcc-12/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-12 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-12-bTRWOB/gcc-12-12.2.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-12-bTRWOB/gcc-12-12.2.0/debian/tmp-gcn/usr --enable-offload-defaulted --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 12.2.0 (Debian 12.2.0-14) 

在创建此示例时,Engee系统允许使用编译链。 gcc 版本 12.2.0 虽然我们更需要这个命令用于调试目的–以确保编译器已安装并正常工作。

在Engee中编译代码

为了以防万一,让我们转到此示例所在的同一文件夹。:

In [ ]:
cd( @__DIR__ )

在这个演示中,我们将运行一个简单的程序,只打印一个信息性消息。

下面是我们将编译和运行的程序的代码。:

``'C
#include<stdio.h>

int主(无效)
{
printf("你好,世界!\n");
返回0;
}


从文件中的源代码中获取可执行文件 hello.c,执行以下命令就足够了:

In [ ]:
;gcc -Wall hello.c -o hello

结果,在此示例的工作文件夹中生成可执行文件。 hello,它可以从命令行或脚本中使用参数运行。

编译代码的执行

如何在脚本或命令行中获取此代码的输出? 第一个选项是在模式下运行命令 shell. 这样你就可以得到输出,但不能把它放在一个变量中。

In [ ]:
;./hello
Hello, world!

该命令的工作原理类似 run 但它的不同之处在于它创建了一个执行可以控制的过程。

In [ ]:
run( `./hello` )
Hello, world!
Out[0]:
Process(`./hello`, ProcessExited(0))

如果编译文件的结果需要放在变量中,可以使用命令 readreadchomp (此命令选项消除了换行符):

In [ ]:
c = readchomp( `./hello` )
Out[0]:
"Hello, world!"

您的代码可以通过作为调用的命令的一部分传递的参数字符串来接受参数。 因此,只能将序列化(文本)数据传输到代码。

另一种选择是使用密钥编译代码。 -shared. 使用它创建一个函数库,并将任何二进制参数传递给它 @ccall.

最后,不是技术最先进,但非常可靠的选择是通过位于文件存储中的文件交换数据。

结论

Engee中,工程师既可以使用data inspectorinteractive scriptsmodeling canvas等高级工具,也可以使用操作系统内核的最低级命令。