Linker 到未定义的符号
我试图编译一些fortran代码,但遇到了一些令人困惑的链接错误。我有一些代码可以编译并放入静态库中: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:
>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
验证情况是否属实gfortran -o mytest -L. mytest.F -lgeo
首先,感谢所有回答的人。我发帖是为了正式结束这个帖子。事实证明,编写库(libgeo.a)的人在代码中放置了几个#ifdef语句,这些语句是使用编译器标志macros-D(macro)打开的。然后,这些#ifdef将用于扩展具有特定参数的函数名。在没有向编译器提供适当宏的情况下,函数名没有展开,因此符号没有定义。Grrrr…是的,我刚试着把linker命令放在最后一个,但问题仍然存在,-L.表示-L。(当前)目录。我的意思是,在你的问题中,你有一个空的-L,没有“.”啊,对不起,我没有注意到。在输入问题的过程中迷失了方向。很明显,这也不是问题所在。我在回答中添加了另一个建议,也许会有帮助?