libtool报错无法从非libtool对象构建库的解决方法
报错原因
libtool构建.la格式库时,仅接受经过自身编译流程生成的带包装的目标文件(通常后缀为.lo)。你手动调用windres直接生成的manifest.o是原生普通目标文件,没有经过libtool的包装处理,因此被libtool的校验规则拦截,和两个目标文件本身能不能二进制合并没有关系。
另外你当前配置里还有个不规范的点:libwinsane_la_SOURCES里只有C源文件init.c,对应编译flag应该用_CFLAGS而不是给C++用的_CXXFLAGS,虽然不会触发当前报错,但建议修正。
可行解决方法
选任意一种即可:
方法1:利用automake内置的Windows资源文件编译规则,不用手写windres编译命令
直接把manifest.rc加入库的源文件列表,automake会自动识别rc后缀,调用libtool包装windres完成编译,产出符合libtool要求的目标文件。修改后的配置参考:noinst_LTLIBRARIES = libwinsane.la libwinsane_la_SOURCES = init.c manifest.rc libwinsane_la_CFLAGS = -I$(top_srcdir) # 单独指定utf8.xml作为资源文件的编译依赖即可 manifest.lo: utf8.xml这种写法最简洁,不需要手动维护windres的调用参数,兼容性最好。
方法2:如果需要自定义windres的执行逻辑,手动调用libtool包装编译流程
不要直接输出普通.o文件,而是通过libtool调用windres生成.lo格式的libtool目标文件,同时把依赖和链接项里的目标名改成manifest.lo。修改后的配置参考:noinst_LTLIBRARIES = libwinsane.la libwinsane_la_SOURCES = init.c libwinsane_la_CFLAGS = -I$(top_srcdir) libwinsane_la_DEPENDENCIES = manifest.lo libwinsane_la_LIBADD = manifest.lo manifest.lo: manifest.rc utf8.xml $(LIBTOOL) --tag=RC --mode=compile windres -o $@ $(top_builddir)/libwinsane/manifest.rc
内容的提问来源于stack exchange,提问作者user2426290
相关产品推荐
相关产品推荐

