2015-04-09 6 views
0

Существует пример кода C, связывающего две статические библиотеки. Этот код скомпилирован через Makefile. Файл make генерирует в первую очередь объектный файл из исходного файла, а затем скрывает его в исполняемый файл с помощью следующих команд. Кроме того, связывает две библиотеки с скомпилированным кодом:Ошибка gcc на код может быть правильно скомпилирована cc и g77

cc -I. -DUNIX -c cademo1.c 
g77 -o cademo1 cademo1.o ../libChemAppC.a ../libLChemApp.a 

Эти две команды являются выходными данными Makefile. Если я смогу запустить их самостоятельно, они будут работать.

Теперь мне нужно компилировать код, GCC:

$ gcc -static cademo1.c -L.. -lChemAppC -lLChemApp -o cademo1 

Но это делает сотни таких ошибок:

. 
. 
. 
rtrnshdr.f:(.text+0x1551): undefined reference to `s_rsue' 
rtrnshdr.f:(.text+0x1564): undefined reference to `do_uio' 
rtrnshdr.f:(.text+0x156c): undefined reference to `e_rsue' 
../libLChemApp.a(bindummy.o): In function `tqhbix_': 
bindummy.f:(.text+0x11): undefined reference to `s_copy' 
../libLChemApp.a(dt.o): In function `tqdtforid_': 
dt.f:(.text+0x11): undefined reference to `s_copy' 
../libLChemApp.a(dt.o): In function `tqhdt_': 
dt.f:(.text+0x5c): undefined reference to `G77_date_and_time_0' 
dt.f:(.text+0x86): undefined reference to `s_wsfi' 
dt.f:(.text+0x99): undefined reference to `do_fio' 
dt.f:(.text+0xad): undefined reference to `do_fio' 
dt.f:(.text+0xc3): undefined reference to `do_fio' 
dt.f:(.text+0xd7): undefined reference to `do_fio' 
dt.f:(.text+0xed): undefined reference to `do_fio' 
../libLChemApp.a(dt.o):dt.f:(.text+0x101): more undefined references to `do_fio' follow 
../libLChemApp.a(dt.o): In function `tqhdt_': 
dt.f:(.text+0x173): undefined reference to `e_wsfi' 
../libLChemApp.a(dt.o): In function `tqhdat_': 
dt.f:(.text+0x1f4): undefined reference to `G77_date_and_time_0' 
../libLChemApp.a(dt.o): In function `tqhgmy_': 
dt.f:(.text+0x22d): undefined reference to `G77_date_and_time_0' 
../libLChemApp.a(progcali.o): In function `tqhpnid_': 
progcali.f:(.text+0x17): undefined reference to `s_copy' 
progcali.f:(.text+0x2c): undefined reference to `s_copy' 
progcali.f:(.text+0x44): undefined reference to `s_copy' 
progcali.f:(.text+0x5c): undefined reference to `s_copy' 
progcali.f:(.text+0x74): undefined reference to `s_copy' 
../libLChemApp.a(progcali.o):progcali.f:(.text+0xf7): more undefined references to `s_copy' follow 
collect2: error: ld returned 1 exit status 

Может кто-нибудь сказать мне, как я могу скомпилировать программу НКУ, которая может быть правильно скомпилирован cc и g77?

Есть ли какие-либо компиляторы args, которые могут быть добавлены в gcc для функций, подобных g77?

+0

'g77' - компилятор fortran ... почему« gcc »сможет сделать то же самое? Однако вы должны заменить 'cc' на' gcc' в этих исходных командах. Полагаю, вы могли бы сказать gcc'у работать в режиме fortran с флагом тоже ... это может сработать. –

ответ

0

Как упоминает Etan, g77 является компилятором FORTRAN. Вы используете его как компоновщик (связывание объектов и библиотек вместе в программу). Это, а также ваши сообщения об ошибках, совершенно ясно, что по крайней мере одна из тех библиотек, которые вы связываете, написана в FORTRAN.

Самое простое решение - продолжать использовать g77 для связи. Компилятор добавит в программу специальные специальные для компилятора библиотеки; например, если вы связываете с g++ (компилятор С ++/линкера), то он добавит в стандартной библиотеке STL и т.д.

Вы не можете сказать, почему использование g77 не является приемлемым, но если это не вы будете иметь чтобы выяснить, какие дополнительные библиотеки g77 связывает и добавляет их в вашу линию ссылок gcc.

Я не установили, так что я не могу вам сказать, что они есть, но вы можете запустить g77 -v ... и он должен показать вам команду g77 передний конец используется для вызова компоновщика: дополнительные библиотеки, необходимые должен появиться там.

+0

missed -DUNIX –

+0

Правда, но это флаг времени компиляции: он вряд ли поможет с ошибками компоновщика в уже построенных библиотеках. Это возможно (если UNIX-определение приведет к тому, что эти объекты в библиотеках вообще не будут связаны), но вряд ли. – MadScientist

+0

', но это флаг времени компиляции: он вряд ли поможет с ошибками компоновщика в уже построенных библиотеках'. Но это может повлиять на искажения фортран. Например, на некоторых платформах fortran-подпрограмм есть те, у которых есть префикс или postfix underscore ('tqhpnid_' loosk как один), а некоторые из них в C могут касаться выбора правильного объявления/имени для процедуры fortran. –