Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Fortran > [Tools] как подключить библиотеку?


Автор: Aprol 16.2.2009, 08:20
Есть скомпилированная библиотека Big.lib.
Как её подключить к компилируемой программе test.for
компилятор gfortran

Автор: Cr@$h 16.2.2009, 17:30
Попробуй при компоновке добавить ключ:
Код

-l Big
(-L Big)

или
Код

-l Big.lib
(-l Big.lib)

Автор: Aprol 18.2.2009, 13:12
Не выходит.
Есть еще варианты?

Автор: Cr@$h 18.2.2009, 16:24
Напишите ваш скрипт компиляции.

Автор: Aprol 19.2.2009, 04:42
>gfortran prog.for (-L Big.lib) -o proga.exe
-------------------
Пробовал все Ваши варианты.

Автор: marcusmae 19.2.2009, 23:33
Это - линукс? = Наверно, нужно написать вместе -LBig.lib или же лучше -L$(PWD)/Big.lib, подразумвая, что библиотека лежит в текущей директории. Странное разрешение - lib (не .а), можно увидеть консольный вывод от компиляции библиотеки и откомпиляции основной проги?

Автор: Aprol 20.2.2009, 04:50
Нет это винда. Исходников библиотеки у меня нет.
Что только уже не пробывал, даже библу переименовал.
D:\...ерситет\ДИПЛОМ\наработки\TnewLIB>gfortran test_rw.for -LTident.lib
D:\DOCUME~1\Anton\LOCALS~1\Temp/cc40EEUW.o:test_rw.for:(.text+0x1b71): undefined
 reference to `_mi1001_'
collect2: ld returned 1 exit status

Запускал по другому, думал сначала нужно подсунуть библу.

D:\...ерситет\ДИПЛОМ\наработки\TnewLIB>gfortran -LTident.lib test_rw.for
D:\DOCUME~1\Anton\LOCALS~1\Temp/ccMYwGcF.o:test_rw.for:(.text+0x1b71): undefined
 reference to `_mi1001_'
collect2: ld returned 1 exit status

Автор: marcusmae 20.2.2009, 09:10
Aprol, похоже что библиотека подключается правильно. В таком случае необходимо проверить, есть ли в ней действительно искомый символ, например, он может не иметь заключительного подчерка, т.е. _mi1001 - этим управляет опция компилятора --no-underscoring. Чтобы просматривать содержимое библиотки, нужна какая-нибудь программа-дампер (COFF/PE Dumper) типа dumpbin или в линухе есть аналогичная утилита nm, не уверен, что она портируется на винду вместе с gnu-компиляторами, но почему бы и нет.

Автор: Aprol 21.2.2009, 05:40

Цитата(marcusmae @  20.2.2009,  09:10 Найти цитируемый пост)
этим управляет опция компилятора --no-underscoring
 Как её использовать ?

Цитата(marcusmae @  20.2.2009,  09:10 Найти цитируемый пост)
dumpbin

Это так понимаю под винду.
И что мне это даст? Как то изменится вызов в главной программе?
Вызвается  в программе вот так 
      CALL MI1001(TN,TK,N,M,N1,K,NI,T0L,H1,ALFH,AA,XHI,BET,NKP,
     *GAM,NKG,ITER,IPR1,IPR2,IPR3,IALF,XXI,XXIK,UU,EPS,PR,MET)

Автор: Aprol 21.2.2009, 06:14
У иеня есть исходники старой версии этой библы. Так вот компилировал её в TIdent.o
Через nm получил список процедур: среди них есть нужная
 000214b4 T _hxxp_
00010a90 T _inpl1_
00010db1 T _inpls1_
00023b0b T _iswri_
0000579a T _m1_
         U _malloc
00000000 T _mi1001_
0000468e T _nagr_
000037b5 T _napr00_
00012bf8 T _napr02_
000062d2 T _napr11_
00007801 T _napr1m_
000156db T _napr2m_
0001844d T _nim_
Ну со старой, то все работает.
Когда натравляю на новую TIdent.lib: >nm TIdent.lib
  U _for_deallocate
  U _for_deallocate
  U _for_deallocate
  U _for_deallocate
  U _for_deallocate
  U _for_deallocate
  U _for_deallocate
  U _for_deallocate
  U _for_deallocate
  U _for_deallocate
  U _for_deallocate
  U _for_deallocate
  U _for_deallocate
  U _for_deallocate
  U _for_deallocate
  U _for_write_seq_fmt
  U _for_write_seq_fmt_xmit
И как то криво все работает

Автор: Aprol 21.2.2009, 06:39
А вот нашел:
00000000 N .debug$T
00000000 i .drectve
00000000 t .text
00000000 A DATA$TIDENT
00000000 T _MI1001
00000000 T _MI1001@108
00000008 C _GRAF
00000014 C _DIMEN
00000018 C _ATIN
00001512 T _DXDA
00001512 T _DXDA@12
00001644 T _POBD
00001644 T _POBD@112
000027ae T _TUNER
000027ae T _TUNER@16
00002870 D _RE
00002890 D _ATUN
00002e9f T _NAPR00
Прочерка в конце нет. А как переделать ?

Автор: marcusmae 21.2.2009, 14:00
Цитата(Aprol @  21.2.2009,  06:39 Найти цитируемый пост)
Прочерка в конце нет. А как переделать ?


Указать --no-underscoring в числе опций компилятору, как-то так:

Цитата

>gfortran prog.for --no-underscoring -LBig.lib -o proga.exe


Добавление подчерков используется для предотвращения конфликтов имён. Почитать об этой и других опциях gfortran можно, например, http://www.linuxmanpages.com/man1/gfortran.1.php.

Автор: Aprol 22.2.2009, 05:10
Та же самая ошибка только теперь  "reference to `_mi1001'".
 smile 
Но она же есть в либе  smile 
Может потому, что в одной библе она объявлена в верхнем регистре, а в другой в нижнем?
Там где работает:
Код

0000579a T _m1_
         U _malloc
00000000 T _mi1001_
0000468e T _nagr_
000037b5 T _napr00_

А там где нет:
Код

0000000 t .text
00000000 A DATA$TIDENT
00000000 T _MI1001
00000000 T _MI1001@108
00000008 C _GRAF

Пр  компиляции ищется именно _mi1001
___________________
Вроде за это отвечает опция -fcase-lower
Но он говорит такого ключа нет

Автор: marcusmae 22.2.2009, 14:44
Выглядит так будто разные версии библиотеки собираются с разными опциями или разными компиляторами. Можно попробовать дать http://www.ncsa.uiuc.edu/UserInfo/Resources/Software/Intel/Compilers/8.1/f_ug1/pgwadjat.htm к имени:

Код

SUBROUTINE MY_SUB (I)
    !DEC$ ATTRIBUTES C, ALIAS:'My_Sub_' :: MY_SUB ! ia32 systems
    INTEGER I
END SUBROUTINE MY_SUB


но это не очень хорошо

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