Смешанный язык, статически связанный с gfortran и gcc - PullRequest
2 голосов
/ 20 августа 2009

У меня есть некоторый код, написанный на C и Fortran, который я хочу скомпилировать в статически связанный исполняемый файл. Если я скомпилирую код динамически (используя опцию -fno-underscoring для gfortran), все будет работать нормально. Однако я хочу связать его в файл .so, статически связывая большинство необходимых библиотек, а затем динамически связать с libkrb5, очень похоже на метод, описанный в этом сообщении в блоге .

Я выполнил действия, описанные в предыдущем сообщении в блоге, и мне удалось без проблем скомпилировать библиотеку .so. nm показывает, что он в хорошей форме, с моими подпрограммами на языке Fortran и функциями C, которые отображаются:

[...]001020b9 T turnover
[...]000d31ea T initio

Первая функция написана на Фортране, а вторая на C. Они не имеют подчеркивания или чего-либо еще, поэтому они должны ссылаться. Моя основная программа (на Фортране) скомпилирована, как и другие исходные файлы на Фортране. Когда я пытаюсь установить связь, я получаю сообщение об ошибке:

gfortran  -m32  main_program.o -o program_static  -L./ -llibname -lkrb5 -lgssapi_krb5 -lsasl2 -lgfortran
/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crt1.o: In function `_start':
/build/buildd/glibc-2.9/csu/../sysdeps/i386/elf/start.S:115: undefined reference to `main'

collect2: ld вернул 1 статус выхода

В main_program.o я вижу, что есть

00000000 T MAIN__

Все выглядит по порядку, так почему же оно не связывается?

1 Ответ

3 голосов
/ 20 августа 2009

ОК, похоже, все оказалось проще, чем я предполагал! Вам просто нужно связать, используя gfortran, и игнорируйте связывание gfortran на этом последнем этапе:

gfortran -static-libgfortran -m32  main_program.o -o program_static\
         -L./ -llibname -lkrb5 -lgssapi_krb5 -lsasl2

Кажется, сейчас работает!

...