Я использую lib.exe для создания библиотеки из скомпилированных объектов Fortran (древний F77 с использованием компилятора Intel 18). Фортран имеет повторяющиеся общие блоки разного размера. Он также имеет дублирующие методы. Это унаследованный код с неуклюжей перегрузкой.

Для повторяющегося метода lib.exe всегда берет метод из первого объекта.

Для дубликата общего блока он берется из последнего объекта в common.lib.

Lib.exe /OUT:target.lib pmk.obj lib.exe target.lib common.lib

Общие блоки отличаются только размером массива, например.

ОБЩИЙ /CPSTKC/ ИСТАК (6 200)

Против

ОБЩИЙ /CPSTKC/ ИСТАК (6,15)

А мне нужен больший.

Я не могу просто изменить порядок lib.exe, так как тогда он использует неправильный метод. Также я не хочу трогать common.lib, если могу, но pmk.f — честная игра.

Как я могу понять, что здесь происходит, чтобы я мог заставить его вести себя?

0
Sam Mackrill 10 Дек 2019 в 18:35

1 ответ

Из-за своего статуса я не могу комментировать, но поскольку больше никто не вмешался, вот что я думаю. У вас есть блоки BLOCKDATA (это инициализирует Commons) в этой программе? Если нет, вы можете добавить это в конец вашей основной программы или создать отдельно. Это может указать форму/размер хранилища массивов. Поскольку они не являются исполняемыми, их нельзя связать из библиотеки, поэтому они должны быть связаны с чем-то явно на этапе связывания, что может упростить их размещение в основном модуле. Вы получаете преимущество явной и перед любыми исполняемыми операторами инициализации общих данных (общий источник ошибок).

Кстати, повторяющиеся методы, о которых вы упоминаете, звучат очень рискованно и зависят от компилятора/компоновщика/версии. (общий псевдоним в меньшей степени, так как я думаю, что он был указан по крайней мере в F77 stds, если не позже) зачем вам один и тот же метод в одной и той же кодовой базе дважды?

1
Cocofalco 14 Дек 2019 в 21:45
Не могу не согласиться с рискованным аспектом. Это древний унаследованный код, к которому я ненавижу прикасаться.
 – 
Sam Mackrill
16 Дек 2019 в 14:59