考虑你有一个模块
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 !.
正如我所说,这是有效的,但我很想知道是否有一种方法可以通过例程来识别库,而不管它是否存在于模块中。
答案 0 :(得分:1)
我为此担心你应该依靠AC_LINK_IFELSE
并自己编写逻辑。
由于AC_LINK_IFELSE
允许您选择语言,因此您应该能够编写Fortran的小片段,以便在模块中查找该函数。