【问题标题】:Compiling C Programs On z/OS Via The Shell In Unix System Services (USS)在 Unix 系统服务 (USS) 中通过 Shell 在 z/OS 上编译 C 程序
【发布时间】:2020-01-26 00:01:59
【问题描述】:

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

我收到CCN0634(U) 的返回码 (rc)。如果我尝试 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.

上面的解释没有多大意义。我用谷歌搜索了一些解决方案。所有搜索结果都导致使用 JCL 进行批量编译。由于有许多不同的口味,所以令人难以抗拒。

Q1:在 Unix Shell 服务上编译 C 程序最简单的方法是什么?

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

预期结果

  • 我的 C 程序的编译

实际结果

  • 我的 C 程序无法编译。

【问题讨论】:

  • 您在编译我们无法在操作系统版本未知的未指定机器上看到的程序时遇到困难,您需要帮助吗?请添加您的代码和缺少的详细信息 - 谢谢。
  • 您的站点上似乎没有正确安装 XL C/C++ 编译器,或者您的 RACF OMVS 权限和/或登录 shell 脚本包含无效信息。您应该联系您的系统程序员。
  • 你说“cc --version 不起作用”。键入该命令时是否收到错误消息?如果将cc 替换为xlc 会怎样?快速的谷歌搜索表明xlc -qversionxlc -qversion=verbose 应该可以工作——如果安装了xlc
  • 消息中提到了一个模块。能否提供完整的消息,包括无法加载的模块?
  • @KeithThompson:是的,我确实犯了错误:-- is not a valid option。是的,它已安装:z/OS V2.3 XL C/C++.

标签: c shell unix mainframe zos


【解决方案1】:

在 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++ 编译器的实用程序可能并不明显。

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

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

【讨论】:

    【解决方案2】:

    我在 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"
    

    回答 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
    

    【讨论】:

    • 您对 Q1 的回答是正确的。我能够通过 SSH 登录并使用 cc 来编译我的 C 程序。我相信这很有效,因为它使用了我的 Mac 的 CC bin。
    • 不,如果您登录到 z/OS 机器,cc 将不会在您的 Macintosh 上调用 ccCC
    • 有效点。那么关键的问题是:为什么我 SSH 进入时 cc 可以工作,而我 TSO 进入时却不能?
    • @KaziR:我不知道 TSO 是什么,但请查看您的 $PATH。当你 ssh 进入时,type cc 说什么?和ls -l $(type -p cc)cc 可能是也可能不是xlc 的符号链接。 cc 可能在您通过 SSH 登录时位于您的 $PATH 中的目录中,但在您通过 TSO 登录时不会。
    • 请注意,declare 命令是 bash 内置命令,不是 z/OS 附带的标准 shell 的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多