我有一些用 C 和 Fortran 编写的代码,我想将其编译成静态链接的可执行文件。如果我动态编译代码(使用-fno-underscoring
gfortran 的选项),一切正常。但是,我想将其链接到.so文件中,静态链接大部分需要的库,然后动态链接到libkrb5
,非常类似于中描述的方法这篇博文 http://stupefydeveloper.blogspot.com/2008/06/gcc-statically-linked-shared-library.html.
我按照上一篇博文中的步骤操作,成功编译了 .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 退出状态
In main_program.o
,我可以看到有
00000000 T MAIN__
一切看起来都井然有序,为什么没有链接呢?
好吧,看起来比我想象的要简单!您只需要使用 gfortran 进行链接,并在最后一步中忽略链接 gfortran:
gfortran -static-libgfortran -m32 main_program.o -o program_static\
-L./ -llibname -lkrb5 -lgssapi_krb5 -lsasl2
看来现在可以工作了!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)