static - 与 gfortran 和 gcc 静态链接的混合语言

标签 static linker fortran mixed-mode gfortran

我有一些用 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__

一切看起来都按顺序进行,为什么没有链接?

最佳答案

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

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

现在似乎可以工作了!

关于static - 与 gfortran 和 gcc 静态链接的混合语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1302818/

相关文章:

c - 确定目标文件的 BSS 大小

python - 在 C/C++、Python 或 Fortran 中编程时输入方程式的方法

c++ - 如何将 Vector 从 C++ 传递到 Fortran?

javascript - 在类和构造函数中访问 ES6/ES7 静态类变量

c - 理解静态 int 执行

java - Java 中 'private static final' 和 'public static final' 类变量的最接近的 Ruby 表示?

c++ - 构建项目时 Unresolved external symbol 错误

Javascript 局部静态变量

c++ - 在 xcode 中构建时出错

fortran - 何时使用 iso_Fortran_env 、selected_int_kind、real(8) 或 -fdefault-real-8 编写或编译 Fortran 代码?