使用ifort / icc时未定义的引用'main'

时间:2015-03-06 15:58:41

标签: c gcc fortran symbols icc

我正在尝试编译用Fortran编写的代码,然后通过C编译器进行链接。当我尝试英特尔编译器ifort + icc时出现问题。如果我对GNU编译器,gfortran + gcc做同样的事情,那就可以了。

贝娄,我们可以看到他们的输出。

ICC,正在工作:

  

ifort -c -o fonts / pgpack.o -g -fno-automatic -fPIC fonts / pgpack.f   ifort:命令行警告#10006:忽略未知选项' -fno-automatic'
  icc -o pgpack fonts / pgpack.o -O2 -L / opt / intel / composer_xe_2013_sp1.0.080 / compiler / lib / intel64 -L / opt / intel / composer_xe_2013_sp1.0.080 / ipp /../ compiler / lib / intel64 -L /opt/intel/composer_xe_2013_sp1.0.080/ipp/lib/intel64 -L / opt / intel / composer_xe_2013_sp1.0.080 / compiler / lib / intel64 -L / opt / intel / composer_xe_2013_sp1.0.080 / mkl / lib / intel64 -L / opt /intel/composer_xe_2013_sp1.0.080/tbb/lib/intel64/gcc4.4 -L / opt / intel / composer_xe_2013_sp1.0.080 / compiler / lib / intel64 -L / usr / lib / gcc / x86_64-redhat-linux / 4.4.7 / -L / usr / lib / gcc / x86_64-redhat-linux / 4.4.7 /../../../../ lib64 -L / usr / lib / gcc / x86_64-redhat-linux / 4.4。 7 /../../../../ lib64 / -L / lib /../ lib64 -L / lib /../ lib64 / -L / usr / lib /../ lib64 -L / usr /lib/../lib64/ -L / opt / intel / composer_xe_2013_sp1.0.080 / compiler / lib / intel64 / -L / opt / intel / composer_xe_2013_sp1.0.080 / ipp /../ compiler / lib / intel64 / -L / opt / intel / composer_xe_2013_sp1.0.080 / ipp / lib / intel64 / -L / opt / intel / composer_xe_2013_sp1.0.080 / mkl / lib / intel64 / -L / opt / intel / composer_xe_2013_sp1.0.080 / tbb / lib / intel64 / g cc4.4 / -L / usr / lib / gcc / x86_64-redhat-linux / 4.4.7 /../../../ -L / lib64 -L / lib / -L / usr / lib64 -L / usr / lib -L ​​/ opt / intel / composer_xe_2013_sp1.0.080 / compiler / lib / intel64 -L / opt / intel / composer_xe_2013_sp1.0.080 / ipp /../ compiler / lib / intel64 -L / opt / intel / composer_xe_2013_sp1.0.080 / ipp / lib / intel64 -L / opt / intel / composer_xe_2013_sp1.0.080 / compiler / lib / intel64 -L / opt / intel / composer_xe_2013_sp1.0.080 / mkl / lib / intel64 -L / opt / intel / composer_xe_2013_sp1.0.080 / tbb /lib/intel64/gcc4.4 -L / opt / intel / composer_xe_2013_sp1.0.080 / compiler / lib / intel64 -L / usr / lib / gcc / x86_64-redhat-linux / 4.4.7 / -L / usr / lib / gcc / x86_64-redhat-linux / 4.4.7 /../../../../ lib64 -L / usr / lib / gcc / x86_64-redhat-linux / 4.4.7 /../../ ../../lib64/ -L / lib /../ lib64 -L / lib /../ lib64 / -L / usr / lib /../ lib64 -L / usr / lib /../ lib64 / -L / opt / intel / composer_xe_2013_sp1.0.080 / compiler / lib / intel64 / -L / opt / intel / composer_xe_2013_sp1.0.080 / ipp /../ compiler / lib / intel64 / -L / opt / intel / composer_xe_2013_sp1.0.080 / ipp / lib / intel64 / -L / opt / intel / composer_xe_2013_sp1.0.080 / mkl / lib / inte l64 / -L / opt / intel / composer_xe_2013_sp1.0.080 / tbb / lib / intel64 / gcc4.4 / -L / usr / lib / gcc / x86_64-redhat-linux / 4.4.7 /../../ .. / -L / lib64 -L / lib / -L / usr / lib64 -L / usr / lib -lifport -lifcore -limf -lsvml -lm -lipgo -lirc -lpthread -lsvml -lc -lgcc -lgcc_s -lirc_s -ldl -lc
  /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o:在功能' _start':
  (.text + 0x20):未定义对`main'

的引用

注意:我很奇怪icc是连接gcc库(/ usr / lib / gcc / ...)。这是正常/对吗?

GCC,工作:

  

gfortran -c -o fonts / pgpack.o -O2 -Wall -fno-second-underscore -g -fno-automatic -fPIC fonts / pgpack.f
  警告:第15行第6列中的不合格标签字符
  警告:第16行第6列中的不合格标签字符
  警告:第17行第6列中的不合格标签字符
  警告:第19行第2列中的不合格标签字符
  警告:第20行第2列中的不合格标签字符
  警告:第21行的第2列中的不合格标签字符
  警告:第24行第2列中的不合格标签字符
  警告:第25行第2列中的不合格标签字符
  gcc -o pgpack fonts / pgpack.o -O2 -L / usr / lib / gcc / x86_64-redhat-linux / 4.4.7 -L / usr / lib / gcc / x86_64-redhat-linux / 4.4.7 -L / usr / lib / gcc / x86_64-redhat-linux / 4.4.7 /../../../../ lib64 -L / lib /../ lib64 -L / usr / lib /../ lib64 - L / opt / intel / composer_xe_2013_sp1.0.080 / compiler / lib / intel64 -L / opt / intel / composer_xe_2013_sp1.0.080 / ipp /../ compiler / lib / intel64 -L / opt / intel / composer_xe_2013_sp1.0.080 / ipp / lib / intel64 -L / opt / intel / composer_xe_2013_sp1.0.080 / compiler / lib / intel64 -L / opt / intel / composer_xe_2013_sp1.0.080 / mkl / lib / intel64 -L / opt / intel / composer_xe_2013_sp1.0.080 / tbb / lib / intel64 /gcc4.4 -L / usr / lib / gcc / x86_64-redhat-linux / 4.4.7 /../../ .. -L / usr / lib / gcc / x86_64-redhat-linux / 4.4.7 - L / usr / lib / gcc / x86_64-redhat-linux / 4.4.7 -L / usr / lib / gcc / x86_64-redhat-linux / 4.4.7 /../../../../ lib64 - L / lib /../ lib64 -L / usr / lib /../ lib64 -L / opt / intel / composer_xe_2013_sp1.0.080 / compiler / lib / intel64 -L / opt / intel / composer_xe_2013_sp1.0.080 / ipp / .. / compiler / lib / intel64 -L / opt / intel / composer_xe_2013_sp1.0.080 / ipp / lib / intel64 -L / opt / in tel / composer_xe_2013_sp1.0.080 / compiler / lib / intel64 -L / opt / intel / composer_xe_2013_sp1.0.080 / mkl / lib / intel64 -L / opt / intel / composer_xe_2013_sp1.0.080 / tbb / lib / intel64 / gcc4.4 -L / usr / lib / gcc / x86_64-redhat-linux / 4.4.7 /../../ .. -lgfortranbegin -lgfortran -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc
  :pgpack

我注意到某些链接的库已更改(例如,libgfortranbegin),但make系统会自动添加/更改它。

我已经尝试过其他帖子提供的解决方案,用于类似的错误,例如使用标志(ifort)-nofor-main和(icc)-nostartfiles,但它仍然失败。

我错过了什么? 感谢。

1 个答案:

答案 0 :(得分:1)

icc情况下,您链接的模块都没有提供函数main()作为程序的入口点。尽管如此gcc成功地链接了该程序,可能部分原因是在链接中包含-lgfortranbegin。这将提供一个标准(gfortranmain()函数,用于在将控制权移交给与PROGRAM中定义的pgpack.f子单元对应的不同命名的例程之前设置Fortran环境。 }。

有可能通过iforticc编译的目标文件链接到一个完整的程序中,但显然你需要一个ifort特定的起点例程,而不是您指定的库提供一个。无论如何,您在icc链接中包含GCC库可能是错误的。我认为你的构建系统正在识别并包含那些,但这样做是不正确的。

无论如何,如果只有一个源自Fortran源的对象文件,则链接gcc / icc会非常奇怪。您应该链接Fortran链接器驱动程序,在两种情况下都与Fortran编译器驱动程序(gfortran / ifort)相同。在这种情况下,您可能不需要任何您当前指定的-L-l选项。

即使您在某些C例程中进行链接,通常也应该使用链接器驱动程序来编写主例程的语言。有一些警告,如果你将其他语言推到混合中(例如C ++)会变得更复杂,但你的特定情况看起来非常简单。