使用z / OS USS编译/链接时定义SYSLIB

时间:2018-04-06 23:28:03

标签: mainframe zos

我在z / OS USS上使用c ++(cxx)来编译和链接c程序。 我从IEW(链接器)收到错误,它无法访问SYSLIB

我假设这必须是出口,例如

export _CXX_LSYSLIB="CEE.SCEELKEDX:CEE.SCEELKED:CBC.SCCNOBJ:SYS1.CSSLIB"

这是我最好的镜头,但在链接过程中仍然出现错误。

ABEND S013-38 OCCURRED WHILE PROCESSING PARTITIONED DATA SET DDNAME SYSLIB. 

2 个答案:

答案 0 :(得分:1)

我认为你有一个错字。而不是:

_CXX_LSYSLIB="CEE.SCEELKEDX:CEE.SCEELKED:CBC.SCCNOBJ:SYS1.CSSLIB"

我想你想要:

_CXX_LSYSLIB="CEE.SCEELKEX:CEE.SCEELKED:CBC.SCCNOBJ:SYS1.CSSLIB"

这是额外的'D'杀了你。蹩脚的错误消息我同意。

答案 1 :(得分:1)

有一种简单的方法可以正确设置在z / OS上的USS中正确链接应用程序所需的环境变量。以下命令说明了它的工作原理:

> xlC -v  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,CXX,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),-qdigraph,-qinfo=lan,-qtempinc=tempinc,-qnortti,-qlanglvl=extended:nolibext:nolonglong,-qnoattr,-qinlrpt=/dev/fd1,-qnoinlrpt,-qtmplparse=no,-qansialias),object(./a.o),NOPPONLY,NULL)
exec: export(export,STEPLIB=CBC.SCCNCMP:CEE.SCEERUN2:CEE.SCEERUN,NULL)
exec: export(export,_CXX_ACCEPTABLE_RC=4,NULL)
exec: /bin/cxx(/bin/cxx,-v,a.o,NULL)
exec: export(export,_CXX_ACCEPTABLE_RC=4,NULL)
exec: export(export,_CXX_PVERSION=0x42030000,NULL)
exec: export(export,_CXX_PSYSIX=CEE.SCEELIB(C128N):CBC.SCLBSID(IOSTREAM,COMPLEX),NULL)
exec: export(export,_CXX_PSYSLIB=CEE.SCEEOBJ:CEE.SCEECPP,NULL)
exec: export(export,_CXX_LSYSLIB=CEE.SCEELKEX:CEE.SCEELKED:CBC.SCCNOBJ:SYS1.CSSLIB,NULL)
FSUM0000I  Utility(c89)                      Level(D170323.1712)
//* cxx ------------------------------------------------------------------------
//LINKEDIT  EXEC  PGM=LINKEDIT,
//  PARM='AMODE=31,RMODE=ANY,TERM=YES,
//  DYNAM=DLL,ALIASES=NO,UPCASE=NO,
//  LIST=OFF,MAP=NO,XREF=NO,INFO=NO,MSGLEVEL=4,
//  REUS=RENT,EDIT=YES,AC=0,CALL=YES,CASE=MIXED'
//SYSLIB   DD  DSN='CEE.SCEELKEX',DISP=SHR,DCB=DSORG=DIR
//         DD  DSN='CEE.SCEELKED',DISP=SHR,DCB=DSORG=DIR
//         DD  DSN='CBC.SCCNOBJ',DISP=SHR,DCB=DSORG=DIR
//         DD  DSN='SYS1.CSSLIB',DISP=SHR,DCB=DSORG=DIR
//C8920    DD  UNIT=SYSALLDA,SPACE=(32000,(100,100)),
//             STORCLAS=,MGMTCLAS=,DATACLAS=,DSNTYPE=,
//             DCB=(RECFM=FB,LRECL=80,BLKSIZE=3200)
//C8961    DD  DSN='CEE.SCEEOBJ',DISP=SHR,DCB=DSORG=DIR
//C8962    DD  DSN='CEE.SCEECPP',DISP=SHR,DCB=DSORG=DIR
//C8921    DD  DSN='CEE.SCEELIB(C128N)',DISP=SHR,DCB=DSORG=NOTDIR
//C8922    DD  DSN='CBC.SCLBSID',DISP=SHR,DCB=DSORG=DIR
//SYSPRINT DD  PATH='/dev/fd1',
//             PATHOPTS=(ORDWR,OCREAT,OAPPEND),FILEDATA=TEXT,
//             PATHMODE=(SIROTH,SIRGRP,SIRUSR,SIWOTH,SIWGRP,SIWUSR)
//SYSTERM  DD  PATH='/dev/fd2',
//             PATHOPTS=(ORDWR,OCREAT,OAPPEND),FILEDATA=TEXT,
//             PATHMODE=(SIROTH,SIRGRP,SIRUSR,SIWOTH,SIWGRP,SIWUSR)
//SYSLMOD  DD  PATH='a.out',
//             PATHOPTS=(OWRONLY,OCREAT),
//             PATHMODE=(SIRWXO,SIRWXG,SIRWXU)
//SYSDEFSD DD  DUMMY,
//             DCB=(RECFM=F,LRECL=80,BLKSIZE=80)
//SYSLIN   DD  *
  INCLUDE C8920
  INCLUDE './a.o'
  AUTOCALL C8961
  AUTOCALL C8962
  INCLUDE C8921
  INCLUDE C8922(IOSTREAM)
  INCLUDE C8922(COMPLEX)
/*

此命令的输出显示需要导出哪些环境变量以及为每个环境定义了哪些数据集。自然,不需要直接使用c89实用程序,可以通过使用xlc实用程序来实现相同的目的。

在您的情况下,可以将cxx命令替换为xlC -F:cxx或仅替换为xlC,因为xlC命令等效于调用c89实用程序的cxx命令。使用xlc而不是c89实用程序的好处是,您可以使用Shell友好选项,这些选项是通过-q语法而不是-Wc,“ ...”语法指定的。