Неопределенные символы при связывании со смешанным C и Fortran в OS X 10.6.4 - PullRequest
1 голос
/ 23 августа 2011

Я пытаюсь скомпилировать код (не мой), который состоит из смешанных исходных файлов на языке Fortran и C, которые скомпилированы в библиотеку.Эта библиотека может быть либо связана напрямую, либо (более полезно) из класса Python.Ранее я успешно создавал код как 32-битный с g77 и gcc, но я столкнулся с ситуацией, когда код использует большие куски памяти и должен быть 64-битным.

У меня естьпопытался собрать как 64-битную версию, так и как универсальный двоичный файл с gfortran 4.2.3 (двоичный дистрибутив от проекта AT & T R) и системой gcc (4.2).Исходные файлы создаются правильно, но когда я пытаюсь установить связь с библиотекой, я получаю много ошибок «Неопределенные символы» для ряда функций Фортрана.Нм в библиотеке показывает, что символы кажутся существующими, но, очевидно, компоновщик их не находит.

Вот две (из многих) команд компиляции (которые не выдают ошибок):

/usr/local/bin/gfortran -arch ppc -arch i386 -arch x86_64  -fPIC -fno-strength-reduce -fno-common -ff2c -Wall -c  lsame.f

gcc -c -I/Users/keriksen/Research/atomic_data/fac -I/Users/keriksen/Research/atomic_data/fac/faclib -O2 -fPIC -fno-strength-reduce -fno-common pmalloc.c

И шаг ссылки, который бомбит:

gcc -o sfac sfac.c stoken.c -I/Users/keriksen/Research/atomic_data/fac -I/Users/keriksen/Research/atomic_data/fac/faclib -O2 -fPIC -fno-strength-reduce -fno-common -L/Users/keriksen/Research/atomic_data/fac -lfac -lm -lgfortran -lgcc

Пример неопределенного символа:

  "_acofz1", referenced from:
      _HydrogenicDipole in libfac.a(coulomb.o)
      _HydrogenicDipole in libfac.a(coulomb.o)

и соответствующего нм, который показывает, что символ существует:

    niobe:atomic_data/fac[14] nm libfac.a | grep acof

0000000000000000 T _acofz1_
0000000000002548 S _acofz1_.eh
                 U _acofz1

Я что-то делаю глупо, например, не включаю необходимый переключатель в компоновщик, илиздесь происходит что-то более тонкое?

1 Ответ

1 голос
/ 23 августа 2011

За предложение Юджи:

Файл заголовка cfortran.h (доступный в Интернете и, по-видимому, довольно широко используемый), который решает проблемы совместимости с C / Fortran, не обрабатывает gfortran «из коробки». Я взломал это (неправильно), чтобы игнорировать этот факт, и заплатил за свою наглость.

Особая проблема заключается в том, что gfortran испускает объектный код, содержащий символы с завершающим подчеркиванием, а gcc - нет.

Правильно было установить переменную окружения CPPFLAGS в -Df2cFortran. Как только этот макрос установлен, cfortran.h добавляет необходимое подчеркивание к символам в объектном коде вызывающих функций C, и компоновщик счастлив.

Еще одна удивительная вещь в этом конкретном случае - сценарий конфигурации просматривает переменную среды F77 для имени компилятора fortran. Как только я установил F77 в «/ usr / local / bin / gfortran -arch x86_64», сгенерированный Makefile оказался верным, и он выдал только 64-битный объектный код. Я не уверен, является ли это стандартным поведением конфигурации, или это особенность этого конкретного сценария.

В результате у меня теперь есть 64-битная разделяемая библиотека, которая прекрасно работает с 64-битным питоном, который я скачал. Я наполовину обдумываю возвращаться и пытаться создать универсальную библиотеку, которая будет работать с системным питоном, но я не уверен, что хочу испытать судьбу.

...