Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linker 到未定义的符号_Linker_Fortran_Static Linking - Fatal编程技术网

Linker 到未定义的符号

Linker 到未定义的符号,linker,fortran,static-linking,Linker,Fortran,Static Linking,我试图编译一些fortran代码,但遇到了一些令人困惑的链接错误。我有一些代码可以编译并放入静态库中: >gfortran -c -I../../inc -o bdout.o bdout.F >ar rv libgeo.a bdout.o 然后,我尝试使用一些简单的测试代码对该库进行编译,并获得以下结果: >gfortran -o mytest -L -lgeo mytest.F /tmp/cc4uvcsj.o: In function `MAIN__': mytest.F:

我试图编译一些fortran代码,但遇到了一些令人困惑的链接错误。我有一些代码可以编译并放入静态库中:

>gfortran -c -I../../inc -o bdout.o bdout.F
>ar rv libgeo.a bdout.o
然后,我尝试使用一些简单的测试代码对该库进行编译,并获得以下结果:

>gfortran -o mytest -L -lgeo mytest.F
/tmp/cc4uvcsj.o: In function `MAIN__':
mytest.F:(.text+0xb0): undefined reference to `ncwrite1_'
collect2: ld returned 1 exit status
它不在对象命名中,因为一切看起来都很好:

>nm -u libgeo.a

bdout.o:
     U _gfortran_exit_i4
     U _gfortran_st_write
     U _gfortran_st_write_done
     U _gfortran_transfer_character
     U _gfortran_transfer_integer
     U ncobjcl_
     U ncobjwrp_
     U ncopencr_
     U ncopenshcr_
     U ncopenwr_
     U ncwrite1_
     U ncwrite2_
     U ncwrite3_
     U ncwrite4_
     U ncwritev_
我也可以检查原始对象文件:

>nm -u bdout.o

     U _gfortran_exit_i4
     U _gfortran_st_write
     U _gfortran_st_write_done
     U _gfortran_transfer_character
     U _gfortran_transfer_integer
     U ncobjcl_
     U ncobjwrp_
     U ncopencr_
     U ncopenshcr_
     U ncopenwr_
     U ncwrite1_
     U ncwrite2_
     U ncwrite3_
     U ncwrite4_
     U ncwritev_
测试代码只包含对bdout.o中定义的函数的单个调用:

program hello
        print *,"Hello World!"
        call ncwrite1( istat, f, ix2, ix3, ix4, ix5, ih )
end program hello
我想不出是什么问题。有人有什么建议吗?也许只是一种追踪问题的方法


干杯。

我不知道这是否有助于解决这个问题,但一般来说,总是将链接器命令放在对象文件之后。其次,如果libgeo.a在当前目录中,您需要显式地添加它,空的-lafaik什么也不做。即

gfortran -o mytest mytest.F -L. -lgeo

编辑:还要注意,nm输出中的“U”表示符号未定义。即,.o文件引用了上述符号,但该符号实际上位于其他文件中。也就是说,您可能需要在定义ncwrite1_uuu符号的库中显式链接。

问题可能是对ncwrite1的调用与子例程库定义的签名不匹配,错误消息真正试图告诉您的是,它找不到签名与该符号匹配的ncwrite1版本呼叫您的程序似乎没有使用ncwrite1的显式接口,因此在编译时不会捕获此类类型错误。

问题在于您没有链接到包含该函数的库。这可能有两个原因:

  • 链接所针对的库中未定义
    ncwrite1
    函数。使用
    nm
    验证情况是否属实
  • 库放在命令行(!)上的对象/源代码文件之前。链接器是有史以来最愚蠢的事情,不会试图解决所有问题(这对高级技术偶尔有用),但这意味着您需要将库放在所有问题之后。如果有许多库,则需要对它们之间的依赖关系进行拓扑排序,以确定将它们列出到链接器的正确顺序
  • 如果我们假设geo库具有您想要的功能(请检查!),那么您应该像这样构建和链接:

    gfortran -o mytest -L. mytest.F -lgeo
    

    首先,感谢所有回答的人。我发帖是为了正式结束这个帖子。事实证明,编写库(libgeo.a)的人在代码中放置了几个#ifdef语句,这些语句是使用编译器标志macros-D(macro)打开的。然后,这些#ifdef将用于扩展具有特定参数的函数名。在没有向编译器提供适当宏的情况下,函数名没有展开,因此符号没有定义。Grrrr…

    是的,我刚试着把linker命令放在最后一个,但问题仍然存在,-L.表示-L。(当前)目录。我的意思是,在你的问题中,你有一个空的-L,没有“.”啊,对不起,我没有注意到。在输入问题的过程中迷失了方向。很明显,这也不是问题所在。我在回答中添加了另一个建议,也许会有帮助?