You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 20:15:39