Autotools教程:如何添加共享库.so文件?
Fortran模块与共享库集成到大型库的configure.ac配置问题
我正在尝试把自己的Fortran模块和一个共享库(.so)整合到一个大型库中。代码能找到.mod文件,模块部分没有报错,但不知道在configure.ac里要加哪些选项才能让系统识别这个共享库。我已经试过以下几个命令,但都没成功:
选项1)
medys_LDADD = -L/PathToDirectory -lnamelib
选项2)
LDADD=PathToDirectory/namelib.so
选项3)
AM_LDADD = PathToDirectory/namelib.so
解决思路与正确配置步骤
首先要明确:你试的这些medys_LDADD、LDADD、AM_LDADD都是Makefile.am里的变量,不是configure.ac的配置项。configure.ac负责检测系统环境和依赖,Makefile.am才是定义编译链接规则的地方,得把两者配合起来用。
在configure.ac中检测共享库
用AC_CHECK_LIB命令检测目标共享库是否存在,同时验证库中的某个导出函数(必须是库中实际存在的函数,Fortran函数名可能带下划线后缀,比如func_,要根据编译器规则调整):AC_CHECK_LIB([namelib], [target_function], [], [AC_MSG_ERROR([找不到namelib共享库])])如果共享库不在系统默认搜索路径,还可以添加自定义路径参数,让用户指定库的位置:
AC_ARG_WITH([namelib-dir], [AS_HELP_STRING([--with-namelib-dir=DIR], [指定namelib库的安装目录])], [NAMELIB_DIR=$withval], [NAMELIB_DIR=/默认路径]) AC_SUBST(NAMELIB_DIR) LDFLAGS="-L${NAMELIB_DIR} $LDFLAGS"在Makefile.am中配置链接规则
根据你的大型库类型,在对应的Makefile.am里添加链接配置:- 如果是用libtool构建的库(比如
libmedys.la):libmedys_la_LDADD = -lnamelib - 如果是可执行文件
medys:medys_LDADD = -lnamelib
不需要写完整路径,因为configure已经通过
LDFLAGS把库路径加入搜索列表了。- 如果是用libtool构建的库(比如
常见排查点
- 确认共享库文件名:Linux标准共享库命名是
libnamelib.so,链接时用-lnamelib;如果你的库是namelib.so(无lib前缀),需要用-l:namelib.so或者直接写完整路径。 - 编译器兼容性:如果共享库是Fortran编译的,确保链接时用同一个Fortran编译器,避免ABI不兼容导致的问题。
- 查看configure日志:运行
./configure时留意输出,确认是否成功检测到namelib库,有没有报错信息。
内容的提问来源于stack exchange,提问作者user790082
相关产品推荐
相关产品推荐

