AC_SEARCH_LIBS无法定位gswteos-10库函数的问题解决
解决gswteos-10与Autotools集成时AC_SEARCH_LIBS检测失败的问题
问题梳理
你为gswteos-10添加了Autotools构建支持,想让它能顺利集成到大量使用Autotools的项目中,但遇到了一个棘手的问题:
- 使用
AC_SEARCH_LIBS([gsw_z_from_p], [gswteos-10])检测库时,./configure返回checking for library containing gsw_z_from_p... no,但你已经通过nm命令确认gsw_z_from_p函数确实存在于库中 - 手动在
Makefile.am里添加z_from_p_LDADD = -lgswteos-10 -lm就能正常编译,说明问题出在Autotools的检测逻辑或者库的构建配置上
根因分析
从你提供的config.log内容,很容易揪出问题的本质:
修复前,当configure尝试用-lgswteos-10链接测试程序时,出现了一堆数学函数的未定义引用:
/usr/bin/ld: /usr/local/lib/libgswteos-10.so: undefined reference to `atan2' /usr/bin/ld: /usr/local/lib/libgswteos-10.so: undefined reference to `sin' /usr/bin/ld: /usr/local/lib/libgswteos-10.so: undefined reference to `exp' ...
这说明gswteos-10库本身依赖数学库(libm),但原构建配置里没有把-lm链接到库中。虽然你要找的gsw_z_from_p函数确实存在,但链接器无法找到它依赖的底层数学符号,导致整个测试链接失败,configure自然就返回“no”了。
解决方案
这里有两种规范的修复方式,你可以根据需求选择:
方案1:修改gswteos-10库的Autotools配置(推荐)
直接把-lm添加到库的LDFLAGS里,让库本身就链接好数学依赖,这样所有使用这个库的项目都不需要再手动处理-lm。就是你提交的这个diff:
diff --git a/Makefile.am b/Makefile.am index eeafcf2..db8eda8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -11,7 +11,7 @@ pkgconfig_DATA = gswteos-10.pc libgswteos_10_la_SOURCES = gsw_oceanographic_toolbox.c gsw_saar.c \ gsw_internal_const.h libgswteos_10_la_CFLAGS = $(AM_CFLAGS) -libgswteos_10_la_LDFLAGS = -module -shared -export-dynamic \ +libgswteos_10_la_LDFLAGS = -lm -module -shared -export-dynamic \ -version-info 3:5:0 TESTS = gsw_check_functions
修复后,configure测试链接时就能正常找到所有依赖符号,返回正确的-lgswteos-10结果。
方案2:在调用AC_SEARCH_LIBS时指定额外依赖库
如果你不想修改gswteos-10的上游配置,可以在自己项目的configure.ac里使用AC_SEARCH_LIBS的第五个可选参数,指定需要额外链接的库:
AC_SEARCH_LIBS([gsw_z_from_p], [gswteos-10], [], [], [m])
这个参数会告诉configure,在测试链接时自动带上-lm,从而解决数学符号未定义的问题。
补充说明
你之前尝试的ldconfig、安装到/usr而非/usr/local这些操作,其实和问题本身无关——因为链接器已经能找到libgswteos-10.so,只是缺少它依赖的数学库而已。
内容的提问来源于stack exchange,提问作者bluesquall
相关产品推荐
相关产品推荐

