Ошибки компоновщика с библиотекой Fortran to C - /usr/lib/libf2c.so: неопределенная ссылка на «MAIN__» - PullRequest
3 голосов
/ 01 декабря 2011

Так что у меня возникли небольшие проблемы с библиотекой с Фортрана в Си. Теперь, прежде чем я попаду в проблему, я могу сказать вам, что я не могу использовать g2c, как предлагали некоторые форумы.

Теперь к проблеме. Когда я пытаюсь скомпилировать очень большой проект, я получаю следующее:

[from the makefile...] g++ -L [~200 dirs] -l [~200 libs] -lf2c  
/usr/lib/libf2c.so: undefined reference to 'MAIN__'  
collect2: ld returned 1 exit status  
make: *** [all] Error 1

Теперь я проверил мой каталог /usr/lib и обнаружил следующее:

$ locate libf2c
/usr/lib/libf2c.so
/usr/lib/libf2c.so.0
/usr/lib/libf2c.so.0.22

Так что, по крайней мере, оно есть. Я использовал Google, который сказал мне, что ввод ...

sudo rm /usr/lib/libf2c.so && sudo ln -s /usr/lib/libf2c.a /usr/lib/libf2c.so

... помогло бы. Кое-что о старости библиотеки означает, что gcc больше не ссылается на нее и пытается найти основной метод там, где его нет. Я так и сделал. Однако после того, как я связался с библиотекой .a, g ++ теперь вообще не может найти библиотеку.

g++ -L [~200 dirs] -l [~200 libs] -lf2c 
/usr/bin/ld: cannot find -lf2c
collect2: ld returned 1 exit status
make: *** [all] Error 1

Итак, по сути, я пошел назад. У кого-нибудь есть идеи относительно того, куда я должен идти отсюда?

РЕДАКТИРОВАТЬ: Так что я думаю, что я понял это. Я последовал за этим , чтобы переустановить библиотеки. Теперь он волшебным образом не жалуется на то, что фортрана не существует. Спасибо за вашу помощь, ребята.

Ответы [ 3 ]

5 голосов
/ 01 декабря 2011

Вы должны были обратить более пристальное внимание на первое сообщение об ошибке.Компоновщик говорит вам, что символ MAIN__ не может быть найден, и это то, что ожидается от f2c, который будет где-то скомпилирован в Фортране main в вашем коде на C или C ++.Сама библиотека f2c работала просто отлично.

Решением исходной ошибки было бы убедиться, что в вашем коде определена правильная точка входа.Возможно, что при использовании C ++ для компиляции у вас возникли проблемы с манипулированием именами, и правильной точки входа для библиотеки f2c не существует.

Теперь, возясь с библиотеками f2c, вы полностью сломали свой f2cмонтаж.Переустановите его и начните снова ...

4 голосов
/ 01 декабря 2011

Ну,

sudo rm /usr/lib/libf2c.so && sudo ln -s /usr/lib/libf2c.a /usr/lib/libf2c.so

удалит /usr/lib/libf2c.so, отсюда и новая ошибка, которую вы получаете.

Поэтому, как минимум, вам придется переустановить эту библиотеку и связать ее с новой версией, а затем посмотреть, где вы находитесь.

1 голос
/ 11 июля 2015

Я знаю, что это старый поток, но он мне помог, когда я столкнулся с той же проблемой.

Я решил ее, применив команды:

sudo rm / usr / lib /libf2c.so && sudo ln -s /usr/lib/libf2c.a /usr/lib/libf2c.so

, как это сделал OP.Я нашел такой же трюк здесь:

http://byeworld.blogspot.com/2009/01/libf2cso-undefined-reference-to-main.html

На самом деле он удаляет динамическую библиотеку и создает псевдоним статической библиотеки.Причина, по которой он не работал для OP, заключалась в том, что у него / нее не было статической библиотеки.Это было ясно из вывода команды LOCATE.

Надеюсь, это поможет кому-то еще.

...