7

我正在为一个私人项目编译库,这取决于许多库。具体来说,其中一个依赖项是用 Fortran 编译的。在某些情况下,我看到使用 编译的依赖项g77,在其他情况下,我看到使用 编译的依赖项gfortran。然后我的项目./configure将与-lg2cor链接-lgfortran,但到目前为止我一直在手动完成。

如果可能的话,我如何通过查看依赖库(通过例如nm或其他一些实用程序?)找出使用的编译器是g77(然后我将-lg2c在我的链接选项中使用)还是gfortran(然后我'会用-lgfortran)?

提前致谢!

4

3 回答 3

6
nm filename | fgrep ' __g77'

如果使用 g77 将给出结果,同时

nm filename | fgrep '@@GFORTRAN'

如果使用 gfortran 将给出结果。

于 2008-11-19T20:00:49.740 回答
3

您需要在 的输出中使用 grep 来nm filename指示是否使用了 g77 或 gfortran。在大多数情况下,如果库至少在一个地方进行输入输出,它将调用 libg2c 或 libgfortran,您会注意到其中有一个符号g77,或gfortran. 所以,最好的办法是使用 grep:

nm filename | grep _g77_
nm filename | grep _gfortran_

两个注意事项:

  1. 按照 geocar的建议,Grepping for@@GFORTRAN是不可靠的:它只能在支持库版本控制的平台上工作,包括例如 linux,但不包括 Windows 或 Mac OS。
  2. 仍然有可能某些编译代码调用绝对不支持库函数(如果它所做的只是简单的算术并且没有输入输出,例如)。在这种情况下,除非它使用调试选项进行编译,否则无法判断哪个编译器输出它。
于 2009-07-23T08:03:09.863 回答
1

您可能可以通过使用 nm 来解决这个问题,并查看编译的代码是否使用了其中一个或另一个的函数,但这是一个相当棘手的问题。您可能能够根据可用的库来确定它(例如,如果没有可用的 libg2c,则它不是 g77),但是如果两者都可用,您仍然会有一些歧义。如果您可以自己构建依赖项,那么您可以使用构建过程的一部分以某种方式(变量、文件等)告诉另一部分您使用了哪一个。

于 2008-11-19T15:45:39.787 回答