2014-02-08 59 views
1

我是使用libtool的新手。但是,這個問題似乎很奇怪。一切都在那裏,但libtool說:「libtool:link:'cuda_transfer.lo'不是一個有效的libtool對象」。但是,生成這個lo文件的規則就在Makefile中。此外,這兩個頭文件也適用於他們應該在哪裏並且能夠工作的地方。任何有關錯誤的想法?當一切都存在時,libtool沒有生成lo文件

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

如何解釋這個人 - 不友好的代碼。 = =

下面是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 
+0

你有沒有,比如'lib_LTLIBRARIES = libsubdir.la',然後是'libsubdir_la_SOURCES = cuda_transfer.c'? –

+0

我已經將該段添加到了我的問題描述中,如上所示。生成cuda_transfer.lo的規則也被插入。 – Asgard

+0

那麼你在「LIBADD」中究竟是如何(預先構建)libtool對象?這些*將不會像現在這樣生成。預計它們會作爲正確的libtool對象存在,或者將其源代碼放在:'EXTRA_libsubdir_la_SOURCES'中。 –

回答

0

好,最好不要讀configure.ac不斷:-)但是如果你仍想,configure.ac是一個組合m4預處理器代碼和普通(bourne)外殼程序片斷。您可以檢查info m4info autoconf,這些文檔相當不錯。

問題的難點在於關於.lo文件。看起來你的makefile包含它的依賴鏈,但沒有明確的構建規則。您可以嘗試找到一個共同的規則編譯.c - >.lo,就像這樣:

.c.lo: 
     $(AM_V_CC)$(LTCOMPILE) -MT [email protected] -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o [email protected] $< 
     $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo 
     ... 
+0

你太棒了!確實有這樣的東西。我將它添加到上面的問題中。但是,我不認爲它是人性化的...如何解釋它... – Asgard

+0

這是通過libtool特定的包裝來調用編譯器的行。它可以從.c對應文件中生成.lo-files(libtool對象),http://www.gnu.org/software/make/manual/make.html#Suffix-Rules。當然,它看起來有點可怕,但畢竟Automake生成的Makefiles並不是每天都想檢查的東西:)。 – user3159253

+0

此時需要做的是調試Makefile的依賴關係/規則鏈。試試問題'make -d cuda_transfer.lo> build.log'。 '無需重新編譯目標'Makefile'.'之前的所有行可以安全地忽略/刪除。 – user3159253

0

安裝最新的libtool。刪除.lo文件並再次使用「make」。