Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Interop] скрестить фортран с сишной либой, проблема с линковкой 
:(
    Опции темы
roginovicci
Дата 29.9.2009, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



Здравствуйте!
У меня такая проблема:

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

//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


Внимание Вопрос! как слинковать это дело? Признательности за помощь не будет предела!!! 
PM MAIL   Вверх
Lipetsk
Дата 29.9.2009, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в форме ;)
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 28.1.2009
Где: Липецк

Репутация: нет
Всего: 5



а где вы библиотеку подключаете?
PM   Вверх
roginovicci
Дата 29.9.2009, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



Lipetsk, см выше, я уже писал:

Код

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


это и есть команда линковки. На ней затык :(
PM MAIL   Вверх
roginovicci
Дата 29.9.2009, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



еще один вопрос! Если в коде функция содержит символы в разных регистрах, например, FuncTion() нельзя ли как нибудь скомпилировать ее в библиотеку где будут имена только в нижнем регистре т.е. function? Или может быть есть параметр при линковке игнорирующий регистр? 
PM MAIL   Вверх
FCM
Дата 1.10.2009, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: 8
Всего: 9



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

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

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


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

Это сообщение отредактировал(а) FCM - 1.10.2009, 15:49
PM MAIL   Вверх
roginovicci
Дата 1.10.2009, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



Спасибо за помощь. Вопрос решается согласно инструкции изложенной здесь:
http://www.yolinux.com/TUTORIALS/LinuxTuto...ortranAndC.html

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

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



FCM, статическая либа называется libfact.a подключается она при линковке опцией -lfact здесь я не ошибся.
PM MAIL   Вверх
popovda
Дата 30.10.2009, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 9.6.2006
Где: Москва

Репутация: нет
Всего: 6



Юзайте bind C и будет вам счастьеsmile


--------------------
С уважением, Попов Д.А.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Fortran | Следующая тема »


 




[ Время генерации скрипта: 0.0723 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.