c++ - 在该文件中,链接器错误:"linker input file unused because linking not done",未定义对函数的引用

  显示原文与译文双语对照的内容

我的文件链接有问题。

基本上,我的程序包括:

  • 主程序 gen1
  • gen1 - 接收到 str2value的输入发送到,输出结果 str2value,使用"赋予记号"中断输入,使用确定对每个令牌执行的处理,并将它们传递给 str2num,或者 str2cmd 。 然后返回结果的数组。
  • str2num - 做一些处理
  • str2cmd - 同样
  • author.py —— python 脚本生成 str2cmd.cstr2cmd.hcmdTable.h

我很确定我有权限,我已经检查过几次了。 我还检查了标题中没有条件 #ifndef 错误。

顺便说一下,我知道gcc不是编译器,它是一个将文件传递给适当编译器的程序,我知道这个。

下面是我的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

#should add a thing that checks str2cmd.h/.c has not been modified by hand
# i could actually compile them to an doxygen them then delete the source files



.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

关于这一切的任何建议? STR2VALUESFILES 有我需要的所有对象文件,用来定义丢失的函数。

时间:

我想你很困惑编译器把事情放在一起。 使用 -c 标志时,换句话说,不链接,输入是 C++ 代码,输出是对象代码。 因此 .o 文件不会与 -c 混合,编译器会警告你。 将目标文件的符号不是搬到其他对象文件。

所有对象文件都应该在最后一个链接器调用上,这不是这里的情况,所以链接器( 通过 g++ front-end调用) 会抱怨丢失的符号。

下面是一个小示例( 显式调用 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)

还有 makedepend 实用程序,它附带了 X11,它有助于源代码依赖的很多。 你可能还需要查看 -Mgcc 选项来构建 make 规则。

...