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

Using a routine defined in a Fortran module to find a library with AC_SEARCH_LIBS (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)])

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

问题是,这不适用于驻留在 Fortran 模块中的函数。 它不起作用的原因是 [=62= 生成的测试代码片段] 只包含一个语句 call blah() 而库对象中的实际名称可能被破坏得面目全非。事实上,应用于库文件的 nm 命令的输出给出了 __bingo_MOD_blah 形式的东西作​​为实际的例程名称(当bingo.f90 是用 gfortran 版本 5 编译的;我不知道这些名称是如何特定于编译器的)。

我目前的解决方案是在模块定义之外人为地添加一个子例程,一个外部子程序,并用它来识别库。也就是说,bingo.f90变成了

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

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

AC_SEARCH_LIBS([autoconfhook],[bingo],,[AC_MSG_WARN(bingo not found)]) #.

正如我所说,这行得通,但我很想知道是否有一种方法可以通过独立于驻留在模块中的例程来识别库。

恐怕你应该依靠 AC_LINK_IFELSE 并自己编写逻辑。

由于 AC_LINK_IFELSE 允许您 select 该语言,您应该能够编写您的 Fortran 小片段来查找模块中的函数。