Вопрос

Я должен создать динамически связанную библиотеку в ZOS. Какие варианты должны быть переданы компилятору.

Кроме того, как проверить, является ли библиотека в ZOS динамически связана [зависит] в других библиотеках. У нас есть LDD в Linux, который показывает эту связь. Есть ли у нас эквивалент «LDD» в ZOS Land?

Это было полезно?

Решение

Вы не говорите это напрямую, но я предполагаю, что вы имеете в виду C/C ++ DLL. Вы также можете делать общие библиотеки и на других языках (даже ассемблер), но шаги будут разными.

Во -первых, вам нужно решить, что вы хотите экспортировать. Многие из примеров IBM используют директиву экспорта компилятора, но имейте в виду, что это может привести к очень медленным исполняемым файлам, в зависимости от вашего стиля кодирования. Если вы не делаете экспорт, вам понадобится #Pragma Export для чего -либо (код или данные), которые вы хотите экспортировать. Не забывайте, что вы можете экспортировать данные (переменные), а также исполняемые функции ... Иногда вам понадобится это, чтобы обмениваться данными с функциями DLL.

Затем вам нужно установить параметры компиляции на оба Client (Caller) и DLL Для использования сцепления DLL ... Это параметр -WC, DLL, и при включении он генерирует дополнительную логику в вашей программе для загрузки и управления DLL. Это хорошая идея, чтобы также включить #Pragma CSECT для ваших экспортируемых функций, если вы думаете, что вам когда -нибудь необходимо обновить DLL, не заменив его полностью.

Когда вы связываете свой DLL, обязательно укажите опцию -WL, DLL (есть много способов ... эта часть отличается, если вы ссылаетесь в партии - я предполагаю, что вы строите в каком -то файл Make ) Ссылка будет генерировать фактический DLL, а также «боковую колоду», содержащую операторы «импорт» для всех ваших экспортируемых функций. Вам понадобится это, чтобы связать любую из программ на стороне клиента, которые вы ожидаете позвонить в DLL. Например, если ваш импорт находится в файле, называемом AAA.X, C89 -WC, DLL MYAPP.C AAA.X скомпилируется вызововым кодом с осознанием, который функционирует в AAA.X, выключены в каком -то DLL.

К вашей точке зрения о том, что DLL называют другие DLL, не забывайте, что DLL может как «служить», так и «потреблять» функции ... включив боковую колоду для функций в других DLL, вы можете иметь DLL, который обеспечивает некоторые функции, пока вызовет другие DLL, чтобы получить доступ к другим.

Сам фактический DLL может быть в нескольких местах в зависимости от природы вашего приложения. Если вы удобны для услуг Unix, это просто исполняемый файл в Libpath. Это также может быть Steplib, Lnklst, LPA и т. Д.

Если вам нужно, вы можете явно получить доступ к вашим DLL во время выполнения с помощью dlopen (), dlsym () и т. Д. Как правило, это позволяет вам точно контролировать, какой DLL вы используете (иногда удобно, если пользователь может предоставить его сам), и это дает вам, какие количества для функционирования указателей, которые разрешаются в DLL.

Есть некоторые другие основные вещи, которые следует учитывать при связывании, например, обеспечение повторного введения вашего кода. Большинство из них изложены в документации IBM, и если вы строите такие вещи, как «C89» (или эквивалент), правильные варианты обычно настроены для вас автоматически (на самом деле, чтобы получить хорошее представление о том, что происходит, поворачиваться На многословном выводе и посмотрите все параметры для себя).

Если вам нужно создать перекрестную ссылку на то, что вызывает, команда Unix Services "NM" может дать вам эту информацию. Если вы создаете подробные списки ссылок, все данные также находятся там, когда вы создаете свои DLL.

Удачи!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top