Engee 文档
Notebook

使用 GCC 在 Engee 中编译 C 代码

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

您可以从 documentation 了解在 Engee 环境中执行外部程序的更多信息。

Engee 中的编译工具

Engee在Unix兼容内核上执行模型和程序,并使用Engee**特有的库和工具。操作系统内核提供了足够的第三方工具,允许创建特定的定制软件和模型开发与测试路径。

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__ )

在本演示中,我们将运行一个简单的程序,它只会打印一条信息。

以下是我们要编译和运行的程序代码:

<br

#include <stdio.h> `C

int main (void)
{
  printf ("Hello, world!\n")
  return 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中,工程师既可以使用数据检查器交互式脚本建模画布等高级工具,也可以使用最低级别的操作系统内核命令。