2010-03-07 20 views
36

Dosyalarımın bağlanmasıyla ilgili bir sorun yaşıyorum.Linker hatası: "linker kullanılmadığı için kullanılmayan bağlantı dosyası", tanımlanmamış başvuru bu dosyada bir işlev

  • ana programda, gen1:

    Temelde, benim program oluşur.
  • gen1 -, çıkışlar str2value sonuçları giriş işleme str2value gönderir alır "dizgeciklerini" kullanarak jeton girdi keser işlem sıralama her belirtece ne belirler ve str2num veya str2cmd onları rahatsız geçer. Daha sonra sonuçların bir dizisini döndürür.
  • str2num - aynen
  • author.py - - bir başlık cmdTable.h gelen str2cmd.c ve str2cmd.h üreten bir Python komut bazı işleme
  • str2cmd yapar.

Eminim, içerdiğim doğru bilgiler var, birkaç kez kontrol ettim. Ayrıca üstbilgilerde #ifndef numaralı koşulun hatalı olduğunu kontrol ettim. İşte

benim Makefile geçerli:

İşte
#CPP = g++ -lserial 
CPP = g++ -DTESTMODE 
C= gcc 
DEFINES = LURC 
CFLAGS = -Wall -fshort-enums -D$(DEFINES) 
PROJECTFILES = gen1.cpp str2value.o 

STR2VALUEFILES = str2value.cpp str2cmd.o str2num.o tokenizer.o str2value.h 

gen1 : $(PROJECTFILES) 
     $(CPP) $(CFLAGS) -o gen1 $(PROJECTFILES) 



str2value.o : $(STR2VALUEFILES) 
#  echo "str2value" 
     $(CPP) $(CFLAGS) -c $(STR2VALUEFILES) 

str2num.o: str2num.cpp str2value.h str2num.hpp 
     $(C) $(CFLAGS) -c $^ 


tokenizer.o: tokenizer.cpp tokenizer.hpp 
     $(CPP) $(CFLAGS) -c $^ 

str2cmd.o : authorCMDs.py cmdTable.h 
     python authorCMDs.py cmdTable.h str2cmd #this uses the gcc -E cmdTable.h -DLURC 
     $(C) $(CFLAGS) -c str2cmd.c str2cmd.h 

#TODO: add a thing that checks str2cmd.h/.c has not been modified by hand 



.PHONEY: clean 
clean: 
     rm *.o 

.PHONEY: all 
all: 
     clear 
     make clean 
     make 

olduğunu ben marka tüm alma çıkışı: Bu konuda ne olduğu konusunda

make clean 
make[1]: Entering directory `/home/frames/LURC/gen1/gen1Source' 
rm *.o 
make[1]: Leaving directory `/home/frames/LURC/gen1/gen1Source' 
make 
make[1]: Entering directory `/home/frames/LURC/gen1/gen1Source' 
python authorCMDs.py cmdTable.h str2cmd #this uses the gcc -E cmdTable.h -DLURC 
str2cmd.c and str2cmd.h, generated from cmdTable.h 

gcc -Wall -fshort-enums -DLURC -c str2cmd.c str2cmd.h 
gcc -Wall -fshort-enums -DLURC -c str2num.cpp str2value.h str2num.hpp 
g++ -DTESTMODE -Wall -fshort-enums -DLURC -c tokenizer.cpp tokenizer.hpp 
g++ -DTESTMODE -Wall -fshort-enums -DLURC -c str2value.cpp str2cmd.o str2num.o tokenizer.o str2value.h 
g++: str2cmd.o: linker input file unused because linking not done 
g++: str2num.o: linker input file unused because linking not done 
g++: tokenizer.o: linker input file unused because linking not done 
g++ -DTESTMODE -Wall -fshort-enums -DLURC -o gen1 gen1.cpp str2value.o 
str2value.o: In function `getValue(char*)': 
str2value.cpp:(.text+0xbd): undefined reference to `str2cmd(char*)' 
str2value.cpp:(.text+0x102): undefined reference to `str2num(char*)' 
str2value.o: In function `getAllValues(char*)': 
str2value.cpp:(.text+0x164): undefined reference to `tokenizer::tokenizer(char*)' 
str2value.cpp:(.text+0x177): undefined reference to `tokenizer::getNumTokens(char const*)' 
str2value.cpp:(.text+0x1a9): undefined reference to `tokenizer::getNextToken(char const*)' 
str2value.cpp:(.text+0x1e9): undefined reference to `tokenizer::getNumTokens(char const*)' 
str2value.cpp:(.text+0x201): undefined reference to `tokenizer::~tokenizer()' 
str2value.cpp:(.text+0x25b): undefined reference to `tokenizer::~tokenizer()' 
collect2: ld returned 1 exit status 
make[1]: *** [gen1] Error 1 
make[1]: Leaving directory `/home/frames/LURC/gen1/gen1Source' 
make: *** [all] Error 2 

herhangi bir öneriniz? STR2VALUESFILES, eksik işlevleri tanımlamak için gereken tüm nesne dosyalarını içerir.

cevap

42

Derleyicinin işleri nasıl bir araya getirdiği konusunda kafanız karıştı. -c bayrağını kullandığınızda, yani hiçbir bağlantı yapılmaz, giriş C++ kodudur ve çıktı nesne kodudur. .o dosyaları bu nedenle -c ile karıştırılmaz ve derleyici bu konuda sizi uyarır. Nesne dosyasındaki semboller gibi diğer nesne dosyalarına taşınmazlar.

Tüm nesne dosyaları, burada geçerli olan son bağlayıcı bağlayıcısında olmalıdır, bu nedenle bağlantı noktası (g++ ön uç ile adlandırılır) eksik sembollerden şikayetçidir.

Burada küçük bir örnek (netlik için açıkça g++ arayarak):

PROG ?= myprog 
OBJS = worker.o main.o 

all: $(PROG) 

.cpp.o: 
     g++ -Wall -pedantic -ggdb -O2 -c -o [email protected] $< 

$(PROG): $(OBJS) 
     g++ -Wall -pedantic -ggdb -O2 -o [email protected] $(OBJS) 

Orada da X11 ile birlikte gelir makedepend yarar var - kaynak kod bağımlılıkları ile çok yardımcı olur. Ayrıca make kurallarını oluşturmak için -Mgcc seçeneğine bakmak isteyebilirsiniz.

+0

Başka nesne dosyalarından nasıl bir nesne dosyası oluşturabilirim o zaman? gen1, str2num str2cmd veya tokenizer –

+0

ile doğrudan dependansa sahip değildir. Her bir .cpp' dosyasını ayrı ayrı derlersiniz ve daha sonra ortaya çıkan tüm '.o' dosyalarını birlikte bağlarsınız. Basit bir 'make' örneği ekledim. –

+0

Unutmayın - bağımlılıkları başlık dosyaları yoluyla değil, bağımlı dosyaları yönetin. –