【问题标题】:Mixed language statically linking with gfortran and gcc与 gfortran 和 gcc 静态链接的混合语言
【发布时间】:2010-11-21 03:06:20
【问题描述】:

我有一些用 C 和 Fortran 编写的代码,我想编译成静态链接的可执行文件。如果我动态编译代码(使用 gfortran 的 -fno-underscoring 选项),一切正常。不过我想把它链接成一个.so文件,静态链接大部分需要的库,然后动态链接到libkrb5,很像this blog post中描述的方法。

我按照上一篇博文中的步骤,成功地编译了 .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__

一切看起来都井井有条,为什么它没有链接?

【问题讨论】:

    标签: static linker fortran mixed-mode gfortran


    【解决方案1】:

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

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

    现在好像可以了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多