2013-08-05 49 views
0

我正在開發一個名爲libspellcheck的庫,以及一個用它來檢查拼寫的程序,稱爲spellcheck。這是我的目錄結構:Automake&Autoconf - 程序無法識別剛創建的靜態庫

libspellcheck 
     -> doc 
     -> man 
     -> libspellcheck (libspellcheck source) 
     -> spellcheck (spellcheck source) 

我想使用一個配置腳本,而不是像我一直使用的普通Makefile。一切順利還好,直到我嘗試編譯拼寫檢查:

Making all in libspellcheck 
make[1]: Entering directory `/home/iandun/libspellcheck-devel/libspellcheck/libspellcheck' 
g++ -DHAVE_CONFIG_H -I.  -g -O2 -MT checker.o -MD -MP -MF .deps/checker.Tpo -c -o checker.o checker.cpp 
mv -f .deps/checker.Tpo .deps/checker.Po 
g++ -DHAVE_CONFIG_H -I.  -g -O2 -MT SpellCorrector.o -MD -MP -MF .deps/SpellCorrector.Tpo -c -o SpellCorrector.o SpellCorrector.cpp 
mv -f .deps/SpellCorrector.Tpo .deps/SpellCorrector.Po 
rm -f libspellcheck.a 
ar cru libspellcheck.a checker.o SpellCorrector.o 
ranlib libspellcheck.a 
make[1]: Leaving directory `/home/iandun/libspellcheck-devel/libspellcheck/libspellcheck' 
Making all in spellcheck 
make[1]: Entering directory `/home/iandun/libspellcheck-devel/libspellcheck/spellcheck' 
g++ -DHAVE_CONFIG_H -I.  -g -O2 -MT spellcheck.o -MD -MP -MF .deps/spellcheck.Tpo -c -o spellcheck.o spellcheck.cpp 
spellcheck.cpp: In function 'int main(int, char**)': 
spellcheck.cpp:111:21: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] 
    char *dictionary = "/etc/english.dict"; //Default Dictionary 
        ^
spellcheck.cpp:164:14: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] 
    dictionary = "/etc/english.dict"; 
      ^
mv -f .deps/spellcheck.Tpo .deps/spellcheck.Po 
g++ -DHAVE_CONFIG_H -I.  -g -O2 -MT meta.o -MD -MP -MF .deps/meta.Tpo -c -o meta.o meta.cpp 
mv -f .deps/meta.Tpo .deps/meta.Po 
g++ -g -O2 "../libspellcheck/libspellcheck.a" -o spellcheck spellcheck.o meta.o 
spellcheck.o: In function `correctMisspelled(std::string, std::string)': 
/home/iandun/libspellcheck-devel/libspellcheck/spellcheck/spellcheck.cpp:29: undefined reference to `correctSpelling(std::string, std::string)' 
spellcheck.o: In function `doFileCheck(char*, char*, char*, spelling)': 
/home/iandun/libspellcheck-devel/libspellcheck/spellcheck/spellcheck.cpp:61: undefined reference to `check_spelling_file(char*, char*, std::string)' 
spellcheck.o: In function `main': 
/home/iandun/libspellcheck-devel/libspellcheck/spellcheck/spellcheck.cpp:193: undefined reference to `add_word(char*, char*)' 
/home/iandun/libspellcheck-devel/libspellcheck/spellcheck/spellcheck.cpp:224: undefined reference to `check_spelling_string(char*, std::string, std::string)' 
meta.o: In function `do_about_msg()': 
/home/iandun/libspellcheck-devel/libspellcheck/spellcheck/meta.cpp:29: undefined reference to `lib_version()' 
collect2: error: ld returned 1 exit status 
make[1]: *** [spellcheck] Error 1 
make[1]: Leaving directory `/home/iandun/libspellcheck-devel/libspellcheck/spellcheck' 
make: *** [all-recursive] Error 1 

我把基準在拼寫檢查目錄我Makefile.am文件libspellcheck.a:

CFLAGS = -m32 -Wall 
LDFLAGS = "../libspellcheck/libspellcheck.a" 

bin_PROGRAMS = spellcheck 
spellcheck_SOURCES = spellcheck.cpp meta.cpp 

並且還改變了我的引用拼寫檢查頭文件:

#include "../libspellcheck/spellcheck.h" 

這是我在libspellcheck文件夾Makefile.am:

CFLAGS = -m32 -Wall 
LDFLAGS = 

lib_LIBRARIES = libspellcheck.a 
libspellcheck_a_SOURCES = checker.cpp SpellCorrector.cpp 

include_HEADERS = spellcheck.h SpellCorrector.h 

這是我Makefile.am在主文件夾:

AUTOMAKE_OPTIONS = foreign 
SUBDIRS = libspellcheck spellcheck man 

而且我configure.ac:

#            -*- Autoconf -*- 
# Process this file with autoconf to produce a configure script. 

AC_PREREQ([2.69]) 
AC_INIT(libspellcheck, 1.25, [email protected]) 
AC_OUTPUT(Makefile libspellcheck/Makefile spellcheck/Makefile man/Makefile) 
AC_CONFIG_SRCDIR([]) 
AC_CONFIG_HEADERS([]) 
AM_INIT_AUTOMAKE 

# Checks for programs. 
AC_PROG_CXX 
AC_PROG_CC 
AC_PROG_CXX 
AC_PROG_RANLIB 



# Checks for libraries. 

# Checks for header files. 
AC_CHECK_HEADERS([stdlib.h,iostream,fstream,string,stdio.h,sstream,cctype,algorithm,boost/algorithm/string.hpp]) 

# Checks for typedefs, structures, and compiler characteristics. 
AC_CHECK_HEADER_STDBOOL 
AC_TYPE_SIZE_T 

# Checks for library functions. 

AC_OUTPUT 

我在做什麼錯?

回答

2
CFLAGS = -m32 -Wall 
LDFLAGS = "../libspellcheck/libspellcheck.a" 

首先,這些是用戶標誌。改爲使用AM_ *表單。

其次,LDFLAGS用於標誌。它靠近命令行的開頭。但是,爲了鏈接,訂單很重要,所以您想要使用LDADD。有幾個方法可以做到這一點,但也許是最好是使用每個目標變量:

spellcheck_LDADD = ../libspellcheck/libspellcheck.a

你不需要這些報價。