компиляция не удалась, так как отсутствует библиотека для программы Gnucobol DB2

Gnucobol - программа db2.sqb, предварительная обработка завершена. Сбой компиляции программы.cbl -

DB2Express-C работает внутри контейнера, а GnuCobol установлен на виртуальной машине

Предварительная обработка DB2 выполнена успешно. Предварительная обработка выполняется для сервера DB2, работающего внутри контейнера.

$ db2 "prep SQLCOBPGM.sqb bindfile target ANSI_COBOL"
$ ls
db2inst1  isus  log  SQLCOBPGM.bnd  `enter code here`SQLCOBPGM.cbl  SQLCOBPGM.sqb  sqllib

Сбой компиляции. Для компиляции библиотеки .cbl и sql копируются на виртуальную машину Ubuntu, на которой установлен GnuCobol.

# cobc -static SQLCOBPGM.cbl -L/db2home/db2inst1/sqllib/lib64 -ldb2 -x -O /usr/bin/ld: не удается найти -ldb2 collect2: ошибка: ld вернул 1 статус выхода

Компилятор cobc завершился неудачно, так как /usr/bin/ld: не удается найти -ldb2 Не хватает некоторых библиотек?


person Arun    schedule 08.07.2019    source источник
comment
Чего-то не хватает в ответах? Если да, пожалуйста, прокомментируйте, если все в порядке, пожалуйста, примите / проголосуйте за ответ.   -  person Simon Sobisch    schedule 29.07.2019


Ответы (2)


Вы указали и библиотеку для связывания (db2), и путь к библиотеке для поиска, что выглядит нормально. В 99% ошибка заключается в том, что либо указанный путь не содержит файл libdb2 (предлагаю добавить в вопрос вывод ls /db2home/db2inst1/sqllib/lib64/libdb2*), либо библиотека не соответствует архитектуре компоновщика (cobc и ld - 64-битные исполняемые файлы , не так ли?), или исполняющий пользователь не имеет прав на чтение библиотек/прав на выполнение на своем пути.

person Simon Sobisch    schedule 09.07.2019
comment
исправлен путь к библиотеке; Ошибка lbd2 устранена. Однако появляется ошибка «Не удается найти модуль sqlgstrt»; поэтому добавил -ldb2api, чтобы решить эту проблему, но почему-то эта библиотека снова отсутствует. Путь показан здесь ›:/home/mmsuser/cobdb2/db2inst1/sqllib/lib64# ls -l libdb2o.so -> libdb2o.so.1 libdb2o.so.1 libdb2apie.so -> libdb2apie.so.1 libdb2apie.so. 1 2 # cobc SQLCOBPGM.cbl -std=default -I/home/mmsuser/cobdb2/db2inst1/sqllib/include/cobol_mf -L/home/mmsuser/cobdb2/db2inst1/sqllib/lib64 -ldb2 -ldb2api -x /usr/ bin/ld: не могу найти -ldb2api - person Arun; 11.07.2019
comment
Я не знаю, где их можно найти, но если это в API, то имя (из предоставленного вами вывода ls), тогда библиотека будет -db2apie, но я сомневаюсь, действительно ли она вам нужна. Я предполагаю, что вы видели db2twilight.blogspot. com/2014/01/ ... Вы также можете подробно проверить с помощью nm some.so | grep " T " экспортированные функции, чтобы узнать, определен ли / где sqlgrst. - person Simon Sobisch; 11.07.2019
comment
Спасибо Саймон -ldb2apie помогает - скомпилировано, привязка тоже сделана. Но, увы, во время выполнения появляется эта ошибка времени компиляции ›# ./arun2 libcob: не удается найти модуль 'sqlgstrt' - да, я видел статью в блоге и пытался предварительно скомпилировать/связать с DB2 и скомпилировать/запустить в Ubuntu VM; Запутался в том, чего не хватает - person Arun; 16.07.2019
comment
Просто для перепроверки: db2apie 64-битный? Cobc тоже 64-битный? Если оба имеют одинаковую архитектуру: существует ли точка входа с именем sqlgsrt (см. вызов nm, показанный выше)? Может быть, это верхний регистр в библиотеке? - person Simon Sobisch; 18.07.2019
comment
Саймон, наконец-то это сработало; esqlOC для предварительной обработки cobc -static для компиляции, odbc.ini обновлен с помощью драйвера DB2 и строки подключения, установленной как Db, драйвер, uid/pwd, не удалось ›esqlOC -static -o arun.cob db2cobpgm.sqb ›cobc -x - static -locsql -L/usr/local/lib arun.cob для предварительной обработки/компиляции ›./sql Conn String:-DBALIAS=SAMPLE;DRIVER=/opt/ibm/db2/V11.1/lib64/libdb2o.so ;UID=db2inst1;PWD=** OCSQL: соединение с БД с помощью SQLDriverConnect ›OCSQL: ПОДГОТОВКА ВВОДА-ВЫВОДА ВЫБРАТЬ EMPNO,WORKDEPT FROM DB2INST1.EMP WHERE EMPNO = ?›SQLCODE:-+000000000 SQLSTATE:-00000 Сотрудник:-000010 Отдел: -А00 - person Arun; 20.08.2019
comment
@Arun, если у вас есть другой ответ на исходный вопрос, опубликуйте его как ответ и примите. - person Simon Sobisch; 20.08.2019

Убедитесь, что каталог, который вы указываете для библиотек:

  • настоящее

  • читается пользователем, выполняющим компиляцию

  • содержит все необходимые библиотеки (их более 100), включая libd2.so.1 и т.д.

Таким образом, при установке Db2-express необходимо выбрать соответствующую опцию, чтобы добавить артефакты для разработки (включения, библиотеки/общие объекты и т. д.).

У меня работает на Linux с cobc. Я также гарантирую, что LD_LIBRARY_PATH включает этот каталог, чтобы разрешить запуск скомпилированных программ.

person mao    schedule 08.07.2019
comment
Почему путь загрузки библиотеки должен влиять на связывание? Путь ссылки уже был указан с -L (и иначе был бы указан с LIBRARY_PATH, не так ли)? - person Simon Sobisch; 09.07.2019