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


Автор: roginovicci 29.9.2009, 12:31
Здравствуйте!
У меня такая проблема:

есть сишная либа:
Код

//fact.c
int fact(int n)
{
    int i,p;
    p=1;
    for(i=1;i<n;i++){
      p=p*i;
    }
    return p;
}


делаем из нее либу так:
Код

gcc -c fact.c -o fact.o
ar cr libfact.a fact.o


пытаемся ее скормить фортрановскому коду:
Код

# main.f
      program demofactorial
      integer*4 fact, n
      print *, "What is n?"
      read *, n
      print *, "The value of", n, " factorial is", fact(n)
      end


компилим:

Код

g77 -c main.f -o main.o
g77 main.o -L. -lfact -o demofact


получаем ошибку линковки:

main.o: In function `MAIN__':
main.f:(.text+0x170): undefined reference to `fact_'
collect2: ld returned 1 exit status


Внимание Вопрос! как слинковать это дело? Признательности за помощь не будет предела!!! 

Автор: Lipetsk 29.9.2009, 13:02
а где вы библиотеку подключаете?

Автор: roginovicci 29.9.2009, 13:09
Lipetsk, см выше, я уже писал:

Код

 g77 main.o -L. -lfact -o demofact


это и есть команда линковки. На ней затык :(

Автор: roginovicci 29.9.2009, 14:47
еще один вопрос! Если в коде функция содержит символы в разных регистрах, например, FuncTion() нельзя ли как нибудь скомпилировать ее в библиотеку где будут имена только в нижнем регистре т.е. function? Или может быть есть параметр при линковке игнорирующий регистр? 

Автор: FCM 1.10.2009, 13:19
1) У тебя во одном месте фигурирует libfact, в другом lfact - разве так должно быть?

2) Кроме того, попробуй в С поменять имя fact на FACT.

3)
Цитата(roginovicci @  29.9.2009,  14:47 Найти цитируемый пост)
Если в коде функция содержит символы в разных регистрах, например, FuncTion() нельзя ли как нибудь скомпилировать ее в библиотеку где будут имена только в нижнем регистре т.е. function? Или может быть есть параметр при линковке игнорирующий регистр? 


Насчеn gcc+g77 не знаю. А в Intel Fortran c помощью директив можно подстроиться под "любое" имя вызываемой С-процедуры. Также предполагаю, что это возможно в любом компиляторе, поддерживающем Фортран-2003 - см. описание модуля iso_binding 

Автор: roginovicci 1.10.2009, 16:25
Спасибо за помощь. Вопрос решается согласно инструкции изложенной здесь:
http://www.yolinux.com/TUTORIALS/LinuxTutorialMixingFortranAndC.html

что касается имен в разном регистре, то приходится править код добавив дирестивы типа #define Function function

также полезной может оказаться опция компилятора  -fno-underscoring.



FCM, статическая либа называется libfact.a подключается она при линковке опцией -lfact здесь я не ошибся.

Автор: popovda 30.10.2009, 20:32
Юзайте bind C и будет вам счастьеsmile

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