2009-08-19 34 views
2

我有一些用C和Fortran编写的代码,我想编译成一个静态链接的可执行文件。如果我动态编译代码(使用gfortran的-fno-underscoring选项),它一切正常。但是,我想将它链接到.so文件,静态链接大部分所需的库,然后动态链接到libkrb5,非常类似于this blog post中所述的方法。与gfortran和gcc静态链接的混合语言

我按照之前的博客文章中的步骤操作,我设法编译.so库没有任何问题。 nm表明,它是在良好的状态,与我的Fortran子程序和C函数显示出来:

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

第一个功能是写在Fortran和C中的第二他们没有下划线或任何东西,所以他们应该联系。我的主程序(在Fortran中)与其他Fortran源文件一样编译。当我试图链接,不过,我得到一个错误:

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__ 

一切看起来都为了,那么为什么它不链接?

回答

3

好吧,看起来它比我想象的更简单!你只需要使用gfortran链接,并在最后一步忽略链接gfortran:

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

似乎现在的工作!