Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Fortran > [General] .obj, .o, .Dll


Автор: S1oven 1.12.2009, 18:53
Подскажите плиз, как собрать фортрановскую DLL (нужно для подключения к .NET сборке)

На руках есть: TU.FOR, TU.OBJ, TU.INP и компилятор G95. 

Cобрать экзешник  получилось, но собрать DLL не могу. Большое кол-во ошибок вида :
tu.o:tu.FOR:(.text+0x2ce5): undefined reference to `__g95_st_write'
tu.o:tu.FOR:(.text+0x2cf3): undefined reference to `__g95_transfer_integer'
...
tu.o:tu.FOR:(.text+0x2f7d): undefined reference to `__g95_line'
tu.o:tu.FOR:(.text+0x2f8e): undefined reference to `__g95_ioparm'
tu.o:tu.FOR:(.text+0x2f98): undefined reference to `__g95_ioparm'

последовательность действий:
1) g95 tu.for -freal-loops -c (получил обьектный tu.o)
2) ld tu.o

может кто посоветует путь попроще, есть же более современные компиляторы. Или может есть возможность сразу сделать Dll из obj ? Тогда чем?

Автор: FCM 1.12.2009, 19:02
Если речь зашла о других компиляторах, можешь попробовать Intel Visual Fortran, соответсвующие версии которого интегрируются в MS Visual Studio 200X.NET.
Там при создании проекта указывается тип проекта - DLL.
Непосредственно в коде с помощью DEC-директив надо указать имена процедур и объектов данных, которые экспортируются из DLL.

Автор: S1oven 1.12.2009, 19:35
Цитата(FCM @ 1.12.2009,  19:02)
Непосредственно в коде с помощью DEC-директив надо указать имена процедур и объектов данных, которые экспортируются из DLL.

Можно чуть-чуть по подробнее. Я должен пометить каждую процедуру и аргументы? 

Автор: FCM 1.12.2009, 20:44
Аргументы процедур не надо. Только то, что может иметь (внешние) связи ("linkage"): имена внешних процедур, СОMMON-блоков, модульных данных и процедур.
Пример, применения директив к имени процедуры  в DLL можешь увидеть в п.3.1 топика http://forum.vingrad.ru/topic-103924.html 
Хотя там общая тема другая, но в п.3.1 приводится код фортран-подпрограмм, которые собираются в DLL.

Автор: FCM 2.12.2009, 08:41
Директивы для аргументов могут понадобиться (но не DLLEXPORT), если нужно подрегулировать способ их передачи в процедуру: по значению или по ссылке. Кроме того, способ передачи аргументов неявно зависит от соглашения о вызове функции (например STDCALL), которое тоже может быть отрегулировано  с помощью директив.

Упомянутые директивы - специфика компиляторов семейства Visual Fortran.
Можно, если используемый компилятор поддерживает стандарт Fortran-2003, попробовать воспользоваться средствами модуля ISO_C_BINDING, но точно не скажу, обеспечивают ли они (или может даже превосходят) те же возможности, которые дают директивы VF.

См. также систему помощи IVF

Автор: S1oven 2.12.2009, 11:15
О, отлично, спасибо за помошь 

Автор: popovda 13.12.2009, 01:21
Я пользуюсь iso_c_binding регулярно. Предупреждаю, что для IntelFortran всё равно требуется указание директив препроцессору. Зато с именами процедур проблем не будет. Указывается имя процедуры буквально так (с учетом регистра), как оно будет передано линковщику. Вот. Тут где-то мой пример по iso_c_binding валялся.

Автор: FCM 13.12.2009, 09:15
Цитата(popovda @  13.12.2009,  01:21 Найти цитируемый пост)
Предупреждаю, что для IntelFortran всё равно требуется указание директив препроцессору.


Непонятно. Разве соответствующие версии IVF не поддерживают iso_c_binding в полном объеме?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)