【问题标题】:Correct way to statically link in gfortran libraries on OSX在 OSX 上静态链接 gfortran 库的正确方法
【发布时间】:2013-07-11 10:03:19
【问题描述】:

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

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

任何人都可以提出一种更优雅的方法吗?

谢谢!

【问题讨论】:

    标签: macos gfortran


    【解决方案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
    

    你会注意到quamath不再存在

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

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

    【讨论】:

      【解决方案2】:

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

      cd /usr/local/gfortran/lib

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

      【讨论】:

        猜你喜欢
        • 2015-10-05
        • 2012-04-14
        • 1970-01-01
        • 2013-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-13
        • 1970-01-01
        相关资源
        最近更新 更多