无法从非 libtool 对象构建 libtool 库 - 任何解决方法?

cannot build libtool library from non-libtool objects - any workaround?

提问人:user2426290 提问时间:6/12/2022 更新时间:8/5/2022 访问量:111

问:

我有这个makefile automake的代码:

noinst_LTLIBRARIES = libwinsane.la
libwinsane_la_SOURCES = init.c
libwinsane_la_CXXFLAGS = -I$(top_srcdir)
libwinsane_la_DEPENDENCIES  = manifest.$(OBJEXT)
libwinsane_la_LIBADD = manifest.$(OBJEXT)
manifest.$(OBJEXT): manifest.rc utf8.xml
    windres -o $@ $(top_builddir)/libwinsane/manifest.rc

它使用 ./configure fine 进行配置,但最终,“make”命令导致错误:

libtool:   error: cannot build libtool library 'libwinsane.la' from non-libtool objects on this host: manifest.o

但是我认为manifest.o可以与init.o完全合并,我不明白为什么libtool如此难以抱怨。有什么解决办法吗?

自动制作 库工具

评论

0赞 ndim 6/14/2022
这个项目是开源的吗?如果是这样,我在哪里可以找到它?我想看看它的构建系统。

答:

1赞 user2426290 6/13/2022 #1
noinst_LTLIBRARIES = libwinsane.la
libwinsane_la_SOURCES = init.c
libwinsane_la_CXXFLAGS = -I$(top_srcdir)
libwinsane_la_LIBADD = manifest.lo
libwinsane_la_DEPENDENCIES  = manifest.$(OBJEXT)

manifest.$(OBJEXT): manifest.rc utf8.xml
    libtool --mode=compile windres -o $@ $(top_builddir)/libwinsane/manifest.rc
1赞 jjorge 8/5/2022 #2

由于涉及 libtool,因此将使用 .lo 后缀来保持一致性。这应该有助于检测源文件的双重使用 (*)。

.rc.${OBJEXT}:
    ${RC} $< $@
.rc.lo:
    libtool --mode=compile --tag=RC ${RC} $< $@

相应的主makefile片段来使用它,我会这样做:

lib_LTLIBRARIES = libfoo.la
libfoo_la_SOURCES = manifest.rc
libfoo_la_LIBADD = manifest.lo
manifest.lo: utf8.xml
# Alternatively:
# bin_PROGRAMS = foo
# foo_SOURCES = manifest.rc
# foo_LDADD = manifest.o
# (*) Be wary of the usual "object 'manifest.$(OBJEXT)' created both with libtool and without"

如果 automake 将来获得了 .rc 源代码的默认规则,这似乎是一种向前兼容的方法,因为 automake 只会再次将 manifest.lo 添加到 LIBADD,这是幂等的。

对于默认的 RC,您可以添加到 configure.ac 中:

LT_PROG_RC