【问题标题】:libtool did not generate a lo file when everything is there当一切都在那里时,libtool 没有生成 lo 文件
【发布时间】:2014-02-08 06:02:24
【问题描述】:

我是使用 libtool 的新手。然而,这个问题似乎很奇怪。一切都在那里,但 libtool 说“libtool:链接:'cuda_transfer.lo' 不是有效的 libtool 对象”。但是,生成这个 lo 文件的规则就在 Makefile 中。此外,这两个头文件也正好在它们应该在的地方并且可以工作。知道出了什么问题吗?

cuda_transfer.lo: particles_cuda.h ../../include/psc_particles_cuda.h

Makefile中另外两个出现cuda_transfer.lo的地方如下

libsubdir_la_DEPENDENCIES = cuda_transfer.lo \

libsubdir_la_LIBADD = \
    cuda_transfer.lo \

.c.lo: 段如下:

.c.lo:
    $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
    $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
    $(am__mv) $$depbase.Tpo $$depbase.Plo
#   $(AM_V_CC)source='$<' object='$@' libtool=yes \
#   DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
#   $(AM_V_CC_no)$(LTCOMPILE) -c -o $@ $<

如何解释这个对人类不友好的代码。 = =

以下是 Brett 建议的代码段。

noinst_LTLIBRARIES = libsubdir.la
libsubdir_la_SOURCES = \
        psc_fields_cuda.c \
        psc_particles_cuda.c \
        psc_push_particles_cuda.c \
        psc_push_fields_cuda.c \
        psc_bnd_cuda.c \
        psc_bnd_particles_cuda.c \
        psc_bnd_fields_cuda.c \
        b40c/kernel_utils.h \
        b40c/radixsort_kernel_common.h \
        b40c/radixsort_key_conversion.h \
        b40c/radixsort_reduction_kernel.h \
        b40c/radixsort_scanscatter_kernel.h \
        b40c/radixsort_scanscatter_kernel3.h \
        b40c/radixsort_scanscatter_kernel4.h \
        b40c/radixsort_spine_kernel.h \
        b40c/vector_types.h \
        cuda_common.h \
        cuda_sort2.h \
        cuda_sort2_spine.h \
        particles_cuda.h \
        psc_bnd_cuda.h \
        psc_bnd_cuda_fields.h \
        psc_cuda.h

libsubdir_la_LIBADD = \
        cuda_transfer.lo \
        cuda_spine.lo \
        cuda_sort2.lo \
        cuda_sort3.lo \
        cuda_exchange_particles.lo \
        cuda_exclusive_scan_2.lo \
        cuda_push_part_yz_1vb.lo

唯一看起来像关于 cuda_transfer.lo 的生成规则是

cuda_transfer.lo: particles_cuda.h ../../include/psc_particles_cuda.h

【问题讨论】:

  • 你有没有,比如说,lib_LTLIBRARIES = libsubdir.la,后跟libsubdir_la_SOURCES = cuda_transfer.c
  • 我将该段添加到我的问题描述中,如您在上面看到的。生成 cuda_transfer.lo 的规则也被插入。
  • 那么,您究竟是如何(预构建)LIBADD 中的 libtool 对象的?这些将不会像现在这样生成。它们应该作为适当的 libtool 对象存在,或者通过在以下位置列出它们的来源:EXTRA_libsubdir_la_SOURCES
  • 我明白了。所以实际上libsubdir_la_DEPENDENCIES = cuda_transfer.lo 一开始就提醒了我这个事实?那么我该如何构建cuda_transfer.lo?唯一看起来像关于cude_transfer.lo 的生成规则是Makefile 中的cuda_transfer.lo: particles_cuda.h ../../include/psc_particles_cuda.h

标签: makefile libtool


【解决方案1】:

试试这个:

yum -y install libtool*

然后 make clean 并重新启动

【讨论】:

    【解决方案2】:

    好吧,最好永远不要阅读configure.ac :-) 但是如果您仍然希望,configure.acm4 预处理器代码和普通(bourne)shell sn-ps 的组合。您可以查看info m4info autoconf,文档相当不错。

    关于.lo 文件的问题的难点。您的 makefile 似乎包含它的依赖链,但没有明确的构建规则。您可以尝试找到编译.c -> .lo 的通用规则,如下所示:

    .c.lo:
          $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
          $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
          ...
    

    【讨论】:

    • 你太棒了!确实有类似的东西。我将它添加到我上面的问题中。但是,我不认为它对人类友好......如何解释它......
    • 这是通过特定于 libtool 的包装器调用编译器的行。它从它们的 .c 对应物 gnu.org/software/make/manual/make.html#Suffix-Rules 生成 .lo 文件(libtool 对象)。当然,它看起来有点可怕,但毕竟 Automake 生成的 Makefile 并不是人们希望每天检查的内容:)。
    • 此时需要调试Makefile的依赖/规则链。尝试问题make -d cuda_transfer.lo &gt;build.log。 ` No need to remake target Makefile'. 之前的所有行都可以安全地忽略/删除。
    【解决方案3】:

    安装最新的 libtool。删除 .lo 文件并再次使用“make”。

    【讨论】:

      猜你喜欢
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 2010-12-31
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多