通过 Unix 系统服务 (USS) 中的 Shell 在 z/OS 上编译 C 程序
Compiling C Programs On z/OS Via The Shell In Unix System Services (USS)
我在 USS 文件系统中有一个 C 文件。我的 C 文件非常基础。它包含打印 "Hello World" 的逻辑。我执行:c89 [文件名]
我得到 CCN0634(U)
的 return 代码 (rc
)。如果我尝试 cc 编译器,则会抛出相同的 rc。我Google前面提到的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.
上面的解释没有多大意义。我 Googled 寻求一些解决方案。所有搜索结果都导致使用 JCL 进行批量编译。由于有许多不同的口味,所以让人不知所措。
Q1:在UnixShell服务上编译C程序最简单的方法是什么?
Q2:如何查看是否安装了编译器? cc --version 不起作用。
预期结果
- 我的C程序编译
实际结果
- 我的 C 程序无法编译。
在 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)
XL C/C++ 编译器是 z/OS 上的一项付费功能,因此您的系统可能没有安装它。正确安装的编译器将在 /bin/../usr/lpp/cbclib/xlc/etc/xlc.cfg
中有一个有效的配置文件
也许需要澄清一下,因为 USS 中有两个调用 XL C/C++ 编译器的实用程序可能并不明显。
c89 实用程序,其操作由多个环境变量控制(大多数用户会 运行 难以弄清楚如何定义所需的环境变量)
xlc 实用程序,其操作由易于设置的配置文件控制。大多数用户对安装编译器的系统程序员自定义的默认配置文件没有问题,但如果更高级的用户需要不同的设置,则可以将配置文件复制到私有文件中并进行修改以满足需要。修改后,可以通过在命令行中包含 -F /path_to_modified_config_file 选项来使用它。
我 运行 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"
回答问题 1 这里是最简单的方法:
下面是我在 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
我在 USS 文件系统中有一个 C 文件。我的 C 文件非常基础。它包含打印 "Hello World" 的逻辑。我执行:c89 [文件名]
我得到 CCN0634(U)
的 return 代码 (rc
)。如果我尝试 cc 编译器,则会抛出相同的 rc。我Google前面提到的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.
上面的解释没有多大意义。我 Googled 寻求一些解决方案。所有搜索结果都导致使用 JCL 进行批量编译。由于有许多不同的口味,所以让人不知所措。
Q1:在UnixShell服务上编译C程序最简单的方法是什么?
Q2:如何查看是否安装了编译器? cc --version 不起作用。
预期结果
- 我的C程序编译
实际结果
- 我的 C 程序无法编译。
在 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)
XL C/C++ 编译器是 z/OS 上的一项付费功能,因此您的系统可能没有安装它。正确安装的编译器将在 /bin/../usr/lpp/cbclib/xlc/etc/xlc.cfg
中有一个有效的配置文件也许需要澄清一下,因为 USS 中有两个调用 XL C/C++ 编译器的实用程序可能并不明显。
c89 实用程序,其操作由多个环境变量控制(大多数用户会 运行 难以弄清楚如何定义所需的环境变量)
xlc 实用程序,其操作由易于设置的配置文件控制。大多数用户对安装编译器的系统程序员自定义的默认配置文件没有问题,但如果更高级的用户需要不同的设置,则可以将配置文件复制到私有文件中并进行修改以满足需要。修改后,可以通过在命令行中包含 -F /path_to_modified_config_file 选项来使用它。
我 运行 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"
回答问题 1 这里是最简单的方法:
下面是我在 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