2015-06-09 84 views
2
使用相同的源文件名時

OS失敗通過使用automake共享庫。 但我得到一個錯誤,automake可能無法處理相同名稱和不同目錄的源代碼。 我不能使用automake在不同的目錄中編譯相同的文件名源代碼嗎?(的automake,libtool的)建立的automake在不同的目錄

例如,lib_sample/lib.c,lib_sample/enhance/lib.c這兩個文件是相同的名稱,但源和目錄不同。

此外,輸入配置後,我檢查src目錄,奇怪的目錄($(LIB_DIR))被創建。

的./configure --with-LIB = /家庭/用戶/工作區/ lib_sample --enable-提高
LS的src/
$(LIB_DIR)生成文件Makefile.am Makefile.in mod_sample.c
- > $(LIB_DIR)已創建。意外的目錄被創建。

當我輸入make命令時,出現錯誤信息。

錯誤消息看起來像這樣。

Makefile:423: /src/.deps/lib.Plo: No such file or directory 
Makefile:424: /src/enhanced/.deps/lib.Plo: No such file or directory 
make[1]: *** No rule to make target `/src/enhanced/.deps/lib.Plo'. Stop. 
make[1]: Leaving directory `/home/user/test/mod_sample/src' 
make: *** [all-recursive] Error 1 

第一個問題是,在configure腳本之後,$(LIB_DIR)目錄被創建。

第二個問題是當我輸入make命令時,生成源代碼失敗。 我認爲libtool在嘗試製作.Plo文件時無法編譯,但我無法理解的是爲什麼automake會嘗試編譯lib_sample/src/lib.c。 因爲在編譯./configure腳本中的源代碼之前,我使用--with-lib和--enable-enhance選項表示LIB_DIR路徑。因此,automake不應該管理src/lib.c。 但是,automake會嘗試編譯lib_sample/src/lib.c並且出現奇怪的消息。

你可以在下面看到代碼,以及詳細的項目結構。

在此先感謝。

這裏詳細介紹。

有兩個目錄。

/家庭/用戶/測試/ mod_sample,(建立失敗)
/家庭/用戶/測試/ lib_sample(在這裏另一源代碼)

configure.ac(/家/用戶/test/mod_sample/configure.ac)

dnl Process this file with autoconf to produce a configure script. 

AC_PREREQ(2.59) 
AC_INIT(sample, 1.5.0) 
AC_PROG_CC 
AC_PROG_CXX 

AC_CANONICAL_SYSTEM 

AM_INIT_AUTOMAKE([subdir-objects]) 

AM_PROG_CC_C_O 

LT_INIT 

AC_PROG_LIBTOOL 

AC_MSG_CHECKING(--with-lib) 
AC_ARG_WITH([lib], 
AC_HELP_STRING([--with-lib=DIR], [Set lib path ]), 
    [LIB_DIR=$withval] 
    [have_lib=yes], 
    [have_lib=no]) 
AC_MSG_RESULT($LIB_DIR) 
AC_SUBST(LIB_DIR) 

AC_ARG_ENABLE([[enhance]], 
    [AS_HELP_STRING([[--disable-enhance]], [enhance])], , 
    [enable_enhance=yes]) 
    test "x$enable_enhance" = "xno" || enable_enhance=yes 
AM_CONDITIONAL([HAVE_ENHANCE], [test "x$enable_enhance" = "xyes"]) 

AC_CONFIG_FILES(Makefile 
      include/Makefile 
      src/Makefile) 
AC_OUTPUT 

頂部目錄Makefile.am(/home/user/test/mod_sample/Makefile.am)

SUBDIRS=src include 

src/Makefile.am(/ home/user/test/mod_sample/src/Makefile。AM)

​​

運行configure命令前做

autoreconf - 如果
的./configure --with-LIB = /家庭/用戶/工作區/ lib_sample --enable-增強

當我輸入'make'時出現錯誤信息。

Makefile:423: /src/.deps/lib.Plo: No such file or directory 
Makefile:424: /src/enhanced/.deps/lib.Plo: No such file or directory 
make[1]: *** No rule to make target `/src/enhanced/.deps/lib.Plo'. Stop. 
make[1]: Leaving directory `/home/user/test/mod_sample/src' 
make: *** [all-recursive] Error 1 

lib_sample目錄結構(在不同的目錄文件名相同)

/home/user/workspace/lib_sample/lib.c
/家庭/用戶/工作區/ lib_sample /增強/ lib.c

lib_sample/lib.c

void lib() 
{ 
    printf("hello\n"); 
} 

lib_sample /增強/ lib.c

void lib() 
{ 
    printf("enhance hello\n"); 
} 
+0

你說你有錯誤?從什麼命令?錯誤是什麼?什麼*確切*在這裏不工作? –

回答

1

我這個回答自己。

根據參考文獻(http://www.gnu.org/software/automake/manual/html_node/Conditional-Sources.html),在這種情況下,用戶指定的變量$(LIB_DIR)不能用於_SOURCES變量。但是,它在我的情況下工作正常,除非變量與相同的文件名和if語句一起使用。問題在於用戶指定的變量在_SOURCES變量中使用,並且if語句具有相同的文件名。

所以,我認爲有兩種可能的解決方案。一個是我可以改變其中的一個文件名來避免使用相同的文件名。另一個是使用變量表示'增強'字符串,它是目錄名稱,用於刪除Makefile.am中的if語句。

解決方案1 ​​

MV lib_sample /增強/ lib.c lib_sample /增強/ lib_enhance.c
使

lib_LTLIBRARIES = libmod_sample.la 
libmod_sample_la_SOURCES = mod_sample.c 

if HAVE_ENHANCE 
    libmod_sample_la_SOURCES+=$(LIB_DIR)/src/enhanced/lib_enhance.C# change the file name 
else 
    libmod_sample_la_SOURCES+=$(LIB_DIR)/src/lib.c 
endif 

但是,我不能更改文件名稱,其原因有點難以解釋,簡而言之,由於源代碼許可。

解決方案2

我以這種方式解決了這個問題。 configure.ac(/home/user/test/mod_sample/configure.ac)的

部分

AC_ARG_ENABLE([[enhance]], 
    [AS_HELP_STRING([[--disable-enhance]], [enhance])], , 
    [enable_enhance=yes]) 
    test "x$enable_enhance" = "xno" || enable_enhance=yes 
AM_CONDITIONAL([HAVE_ENHANCE], [test "x$enable_enhance" = "xyes"]) 
AM_COND_IF([HAVE_ENHANCE], [AC_SUBST(ENHANCE, "enhance")], [AC_SUBST(ENHANCE, "")]) # Add this line 

的src/Makefile.am(/家庭/用戶/測試/ mod_sample/SRC /生成文件。am)

lib_LTLIBRARIES = libmod_sample.la 
libmod_sample_la_SOURCES = mod_sample.c 

# Use $(ENHANCE) variable to remove if statement 
# $(ENHANCE) can be "enhance" or empty string. 
libmod_sample_la_SOURCES+=$(LIB_DIR)/src/$(ENHANCE)/lib.c