链接器错误:“链接器input文件未使用,因为链接没有完成”,未定义的引用该文件中的函数

我在链接我的文件时遇到了麻烦。

基本上,我的程序包括:

  • 主程序gen1
  • gen1 – 接收input发送到str2value进行处理,输出结果str2value ,使用“tokenizer”确定input到令牌的处理方式,确定对每个令牌执行什么样的处理,并将它们传递给str2numstr2cmd 。 然后它返回一个结果数组。
  • str2num – 做一些处理
  • str2cmd – 同上
  • author.py – 一个str2cmd.h文件cmdTable.h生成str2cmd.cstr2cmd.h的python脚本。

我很确定我有我的包括权利,我已经检查了几次。 我也检查了在标题中没有#ifndef错误的条件。

这是我的Makefile:

 #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 

这里是我从全部收到的输出:

 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 

有关这是关于什么的任何build议? STR2VALUESFILES具有我需要的所有对象文件,以定义缺less的function。

我想你对编译器如何把事情放在一起感到困惑。 当你使用-c标志,即没有链接完成,input是C ++代码,输出是目标代码。 .o文件因此不会与-c混合,编译器会警告您。 来自目标文件的符号不会移动到其他目标文件中。

所有的对象文件都应该在最终的链接器调用上,这里不是这种情况,所以链接器(通过g++前端调用)抱怨丢失的符号。

这里有一个小例子(清晰地调用g++ ):

 PROG ?= myprog OBJS = worker.o main.o all: $(PROG) .cpp.o: g++ -Wall -pedantic -ggdb -O2 -c -o $@ $< $(PROG): $(OBJS) g++ -Wall -pedantic -ggdb -O2 -o $@ $(OBJS) 

还有X11附带的makedepend实用程序 – 对源代码依赖性有很大的帮助。 你可能也想看看用于构buildmake规则的-M gcc选项。