2009-08-19 109 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 

似乎現在的工作!