在OSX上静态链接gfortran库的正确方法

时间:2013-07-11 10:03:19

标签: macos gfortran

我想发布一个Fortran程序,所以我想在gfortran库中静态链接。

如果我使用以下标志编译程序:

gfortran -o myprog -static-libgfortran -static-libgcc  myprog.f

otool告诉我,它在大多数gofrtran库中都是静态链接的,但不是libquadmath:

otool -L myprog

/usr/local/gfortran/lib/libquadmath.0.dylib (compatibility version 1.0.0, current v
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)

有一个静态libquadmath库/usr/local/gfortran/lib/libquadmath.a,但我尝试过的每个链接总是最终得到一个完整的静态链接(在OSX上不支持)或者是一个到libquadmath的动态链接。

我已经设法通过从/ usr / local / gfortran / lib /中删除libquadmath.0.dylib和libquadmath.dylib来创建我想要的东西,然后链接器就会引入静态库。

然而,至少可以说这似乎有些笨拙。

有人能建议更优雅的方式吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

我知道这是一个非常老的跟踪器,但也许有人会对有效的解决方案感兴趣。

假设我们有代码:

! fort_sample.f90
program main
  write (*,*) 'Hello'
  stop
end

首先,编译内容:

gfortran -c -o fort_sample.o fort_sample.f90

然后,链接东西

ld -o ./fort_sample -no_compact_unwind \
-arch x86_64 -macosx_version_min 10.12.0 \
-lSystem \
/usr/local/gfortran/lib/libgfortran.a \
/usr/local/gfortran/lib/libquadmath.a \
/usr/local/gfortran/lib/gcc/x86_64-apple-darwin16/6.3.0/libgcc.a \
fort_sample.o

你可以执行它

./fort_sample
 Hello

您可以注意到四元不再存在

> otool -L fort_sample
fort_sample:
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.51.1)

我想这首先是你要找的东西。没有删除dylibs,没有符号链接等。

答案 1 :(得分:0)

这个问题多年来一直困扰着我 - 但我终于找到了一种简单的方法来解决它。如果删除/重命名 dylib,链接器将改为加载静态版本

cd /usr/local/gfortran/lib

sudo mv libquadmath.0.dylib重命名_libquadmath.0.dylib