12

我有一个要分发的 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 来创建我想要的东西,然后链接器会拉入静态库。

但是,至少可以说,这似乎有些笨拙。

谁能建议一种更优雅的方式来做到这一点?

谢谢!

4

2 回答 2

5

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

假设我们有代码:

! 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

您会注意到 quadmath 不再存在

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

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

于 2017-06-23T19:10:10.330 回答
0

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

cd /usr/local/gfortran/lib

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

于 2021-03-18T22:06:18.067 回答