有一个示例C代码链接到两个静态库。 此代码通过Makefile编译。 makefile首先从源文件生成一个目标文件,然后通过以下命令将其转换为可执行文件。另外,将两个库链接到已编译的代码:
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
有谁能告诉我如何通过gcc编译程序,cc和g77可以正确编译?
是否有任何编译器参数可以添加到gcc中,其功能与g77相同?
答案 0 :(得分:0)
正如Etan所提到的,g77
是一个FORTRAN编译器。您在此处将它用作链接器(将对象和库链接到一个程序中)。这个以及您的错误消息非常清楚,您链接的这些库中至少有一个是用FORTRAN编写的。
最简单的解决方案是继续使用g77
进行链接。链接器将为您添加特殊的特定于编译器的库;例如,如果您链接到g++
(C ++编译器/链接器),那么它将添加标准STL库等。
您没有说为什么使用g77
是不可接受的,但如果不是,您将不得不弄清楚哪些额外的库g77
正在关联并将其添加到您的gcc
手动链接。
我没有安装它所以我不能告诉你它们是什么,但是你可以运行g77 -v ...
并且它应该显示g77
前端用来调用它的命令链接器:您需要的额外库应该显示在那里。