使用Fortran模块中定义的例程查找具有AC_SEARCH_LIBS(autoconf)

时间:2016-03-30 17:17:39

标签: fortran shared-libraries autotools autoconf

考虑你有一个模块

module bingo
  contains
    subroutine blah()
    end subroutine blah
end module bingo

在名为 bingo.f90 的文件中。

让我们说你从bingo.f90

创建了一个共享库libbingo.so

现在,如果您的程序使用 libbingo ,则在 configure.ac 中,一个可以编写类似

的内容
AC_SEARCH_LIBS([blah],[bingo],,[AC_MSG_WARN(bingo not found)])

检查可搜索系统路径中是否存在 libbingo ,或LDFLAGS env。变量。宏AC_SEARCH_LIBS生成一个超级简单的代码片段,其中包含对blah的调用,以确保我们使用正确的库。

问题是,这不适用于驻留在Fortran模块中的函数。它不起作用的原因是AC_SEARCH_LIBS生成的测试代码段只包含一个语句{{1}虽然库对象中的实际名称可能被破坏得无法识别。事实上,应用于库文件的 nm 命令的输出提供了 __ bingo_MOD_blah 形式的实际例程名称(当 bingo.f90 时是用gfortran v.5编译的;我不知道这些名称是如何编译特定的。)

到目前为止,我的解决方案是在模块定义之外人工添加子程序,外部子程序,并使用它来识别库。换句话说, bingo.f90 变为

call blah()

如果使用以下宏,生成的 configure 脚本将正确找到 libbingo

module bingo
  contains
    subroutine blah()
    end subroutine blah
end module bingo
subroutine autoconfhook()
end subroutine autoconfhook !. 

正如我所说,这是有效的,但我很想知道是否有一种方法可以通过例程来识别库,而不管它是否存在于模块中。

1 个答案:

答案 0 :(得分:1)

我为此担心你应该依靠AC_LINK_IFELSE并自己编写逻辑。

由于AC_LINK_IFELSE允许您选择语言,因此您应该能够编写Fortran的小片段,以便在模块中查找该函数。