使用Autoconf子项目Libtool生成的库时出现链接错误
Autoconf主项目链接子项目Libtool库时链接错误的解决方法
问题现象
构建包含子项目的Autoconf/Automake工程时,主项目尝试链接子项目通过Libtool生成的liba.la库,执行make时触发链接错误:
$ make [...] gcc -g -O2 -o test test.o liba/liba.la liba/liba.la: file not recognized: file format not recognized collect2: error: ld returned 1 exit status make[2]: *** [Makefile:417: test] Error 1
直接指定test_LDADD = liba/.libs/liba.so可临时解决,但不符合Libtool规范,需采用正确方案。
问题原因
主项目的configure.ac未初始化Libtool(缺少LT_INIT宏),导致Automake生成的Makefile无法识别Libtool的.la脚本文件,直接将其作为普通目标文件传递给gcc,而gcc无法解析.la格式。
解决步骤
- 修改主项目
configure.ac,启用Libtool支持
在主项目的configure.ac中添加LT_INIT宏:
AC_INIT([test], [1.0.0]) AM_INIT_AUTOMAKE([foreign subdir-objects]) LT_INIT AC_CONFIG_SUBDIRS([liba]) AC_PROG_CC AC_CONFIG_FILES([Makefile]) AC_OUTPUT
- 重新生成配置并构建
执行以下命令更新配置文件并重新构建:
autoreconf -i ./configure make
说明
添加LT_INIT后,Automake会生成适配Libtool的链接规则,链接时会调用libtool处理liba.la文件,自动解析出实际的共享库路径,生成符合预期的链接命令:
gcc -g -O2 -o test test.o liba/.libs/liba.so
主项目Makefile.am中test_LDADD = liba/liba.la的写法保持不变,这是Libtool跨子项目链接的标准方式。
内容的提问来源于stack exchange,提问作者Fabio Porcedda
相关产品推荐
相关产品推荐

