通过Unix系统服务(USS)中的Shell在z / OS上编译C程序

1 c unix shell mainframe zos

我的USS文件系统中有一个C文件。我的C文件非常基本。它包含打印“ Hello World”的逻辑。我执行:c89 [文件名]

我得到的返回码(rcCCN0634(U)。如果尝试cc编译器,则会抛出相同的rc。我谷歌上述rc。IBM知识中心告诉我以下内容:

Check that the compiler is installed correctly. Make sure there is enough memory in the region to fetch the module. You may need to specify the runtime option HEAP(,,,FREE,,) to prevent the compiler from running out of memory.

上面的解释没有多大意义。我用Google搜索了一些解决方案。所有搜索结果都导致使用JCL进行批量编译。因为有很多不同的口味,所以它令人不知所措。

问题1:在Unix Shell Services上编译C程序的最简单方法是什么?

Q2:如何检查是否已安装编译器?cc --version不起作用。

预期结果

  • 我的C程序的编译

实际结果

  • 我的C程序无法编译。

Mil*_*vic 5

在z / OS上的USS中编译C程序的最简单方法是使用xlc实用程序。这是一个带有两个命令行选项-v和-qphaseid的示例,它们显示了有关实用程序版本和编译过程中涉及的编译器组件的信息:

xlc -v -c -qphaseid a.c
FSUM0000I  Utility(xlc)                      Level(D170323.1712)
exec: export(export,XL_CONFIG=/bin/../usr/lpp/cbclib/xlc/etc/xlc.cfg:xlc,NULL)
exec: /usr/lpp/cbclib/xlc/exe/ccndrvr(/usr/lpp/cbclib/xlc/exe/ccndrvr,./,./a.c,*.c,CMDOPTS(DEFINE(errno=(*__errno())),NOTEST,-qoe,-qargparse,-qexecops,-qflag=i,-qhalt=16,-qnodebug,-qnolsearch,-qredir,-qlocale=POSIX,-qlongname,-qmaxmem=*,-qmemory,-qnestinc=255,-qnoexpmac,-qnoexportall,-qnogonumber,-qtarget=le,-qnolibansi,-qlist=/dev/fd1,-qnolist,-qnomargins,-qnooffset,-qnosequence,-qnoshowinc,-qsource=/dev/fd1,-qnosource,-qnoxref,-qterminal,-qnooptimize,-qplist=host,-qspill=128,-qstart,-qnoipa,DEFINE(_OPEN_DEFAULT=1),-qansialias,-qcpluscmt,-qlanglvl=extended,-qnoupconv,-qnoalias,-qnoaggregate,-qnoinfo,-qnoevents,-qrent,-qinline=auto:noreport:100:1000,-qnoinline),object(./a.o),-qphaseid,NOPPONLY,NULL)
exec: export(export,STEPLIB=CBC.SCCNCMP:CEE.SCEERUN2:CEE.SCEERUN,NULL)
exec: export(export,_C89_ACCEPTABLE_RC=4,NULL)
CCN0000(I) Product(5650-ZOS) Phase(CCNEOPTP) Level(D190612.Z2R3)
CCN0000(I) Product(5650-ZOS) Phase(CCNDRVR ) Level(D190612.Z2R3)
CCN0000(I) Product(5650-ZOS) Phase(CCNEP   ) Level(D190612.Z2R3)
CCN0000(I) Product(5650-ZOS) Phase(CCNETBY ) Level(D190612.Z2R3)
CCN0000(I) Product(5650-ZOS) Phase(CCNECWI ) Level(D190612.Z2R3)
Run Code Online (Sandbox Code Playgroud)

XL C / C ++编译器是z / OS上的付费功能,因此您的系统可能未安装它。正确安装的编译器将在/bin/../usr/lpp/cbclib/xlc/etc/xlc.cfg中具有有效的配置文件

可能需要进行澄清,因为在USS中有两个调用XL C / C ++编译器的实用程序可能并不明显。

  1. c89实用程序,其操作由许多环境变量控制(大多数用户在弄清楚如何定义所需的环境变量时会遇到困难)

  2. xlc实用程序,其操作由易于设置的配置文件控制。大多数用户可以使用由安装了编译器的系统程序员定制的默认配置文件来满足要求,但是如果更老练的用户需要其他设置,则可以将配置文件复制到私有文件中并进行修改以满足需要。修改后,可以通过在命令行上包含-F / path_to_modified_config_file选项来使用它。


Hog*_*rom 5

我正在 z/OS 2.4 上运行。

一个常见问题是托管编译器的库不可访问。我的 shell 环境中有这样的设置:

export STEPLIB="none:CEE.SCEERUN:CBC.SCLBDLL:CBC.ACCNCMP" 最后一个数据集托管您指示未找到的模块。

此外,这里还有一些附加设置(注意:由于自定义,其中一些库可能在您的系统上有所不同,但这些是默认库):

declare -x _C89_CLIB_PREFIX="CBC"
declare -x _C89_INCDIRS="/usr/include /usr/lpp/ioclib/include"
declare -x _C89_LIBDIRS="/lib /usr/lib"
declare -x _C89_PLIB_PREFIX="CEE"
declare -x _C89_SLIB_PREFIX="SYS1"
declare -x _C89_WORK_UNIT="SYSDA"
declare -x _CC_CLIB_PREFIX="CBC"
declare -x _CC_INCDIRS="/usr/include /usr/lpp/ioclib/include"
declare -x _CC_LIBDIRS="/lib /usr/lib"
declare -x _CC_PLIB_PREFIX="CEE"
declare -x _CC_SLIB_PREFIX="SYS1"
declare -x _CC_WORK_UNIT="SYSDA"
declare -x _CEE_RUNOPTS="FILETAG(AUTOCVT,AUTOTAG) POSIX(ON)"
declare -x _CXX_CLIB_PREFIX="CBC"
declare -x _CXX_INCDIRS="/usr/include /usr/lpp/ioclib/include"
declare -x _CXX_LIBDIRS="/lib /usr/lib"
declare -x _CXX_PLIB_PREFIX="CEE"
declare -x _CXX_SLIB_PREFIX="SYS1"
declare -x _CXX_WORK_UNIT="SYSDA"
Run Code Online (Sandbox Code Playgroud)

对于 Q1 的回答,这是最简单的方法:

以下是我在 USS 中的 shell 会话的输出:

IBMUSER:/u/ibmuser #>cat t.c
#include <stdio.h>

int main(int argc, char **argv) {
  printf("hello world\n");
  return(0);
}
IBMUSER:/u/ibmuser #>cc t.c
IBMUSER:/u/ibmuser #>./a.out
hello world
Run Code Online (Sandbox Code Playgroud)