Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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, 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 валялся. |