我想在 autoconf 子项目中使用 libtool 创建的库,但我得到:
$ 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
配置.ac
AC_INIT([test], [1.0.0])
AM_INIT_AUTOMAKE([foreign subdir-objects])
AC_CONFIG_SUBDIRS([liba])
AC_PROG_CC
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
Makefile.am
SUBDIRS = liba
bin_PROGRAMS = test
test_SOURCES = test.c
test_LDADD = liba/liba.la
测试.c
int main()
{
}
liba/configure.ac
AC_INIT([liba], [1.0.0])
AM_INIT_AUTOMAKE([foreign subdir-objects])
LT_INIT
AC_CONFIG_FILES([Makefile])
AC_CONFIG_MACRO_DIRS([m4])
AC_OUTPUT
liba/Makefile.am
ACLOCAL_AMFLAGS = -I m4
lib_LTLIBRARIES = liba.la
liba_la_SOURCES = liba.c
liba/liba.c
mkdir -p liba/m4
autoreconf -i
[...]
./configure
[...]
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
应该是这样的:
gcc -g -O2 -o test test.o liba/.libs/liba.so
当我将库和程序放在同一个 autoconf/automake 项目中时,它可以工作,但如果我使用子项目,则不行。
作为解决方法,如果我使用:
test_LDADD = liba/.libs/liba.so
但我认为这是一种解决方法而不是正确的解决方案。
要修复该错误,只需在configure.ac中添加LT_INIT即可。