Компиляция программ на C в z / OS через оболочку в Unix System Services (USS) - PullRequest
1 голос
/ 25 сентября 2019

У меня есть файл C, находящийся в файловой системе USS.Мой C-файл довольно простой.Содержит логику для печати "Hello World".Я выполняю: c89 [имя файла]

Я получаю код возврата (rc) CCN0634(U).Тот же rc выдается, если я попробую компилятор cc.Я 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.

Приведенное выше объяснение не имело особого смысла.Я гуглил по некоторым решениям.Все результаты поиска привели к компиляции в пакетном режиме с использованием JCL.Это было ошеломляюще, поскольку было много разных вариантов.

Q1: Какой самый простой способ компилировать программу на C в Unix Shell Services?

Q2: Как проверить, установлен ли компилятор?cc - версия не работает.

Ожидаемый результат

  • Компиляция моей программы на C

Фактический результат

  • Моя C программа не компилируется.

Ответы [ 2 ]

4 голосов
/ 25 сентября 2019

Самый простой способ компилировать программу на C в USS на z / OS - использовать утилиту 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.

3 голосов
/ 26 сентября 2019

Я работаю в z / OS 2.4.

Одной из распространенных проблем является то, что библиотеки, в которых размещается компилятор, недоступны.У меня есть этот параметр в моей оболочке:

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:

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
...