C++ 链接器错误:“链接器输入文件未使用,因为链接未完成”,未定义对该文件中函数的引用

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2395158/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-27 23:19:23  来源:igfitidea点击:

Linker error: "linker input file unused because linking not done", undefined reference to a function in that file

c++cgccmakefilelinker-errors

提问by Lyndon White

I'm having trouble with the linking of my files.

我在链接文件时遇到问题。

Basically, my program consists of:

基本上,我的程序包括:

  • The main program, gen1.
  • gen1- receives input sends to str2valuefor processing, outputs results str2value, breaks input into tokens using "tokenizer" determines what sort of processing to do to each token, and passes them off to str2num, or str2cmd. It then returns an array of the results.
  • str2num- does some processing
  • str2cmd- ditto
  • author.py- a python script that generates str2cmd.cand str2cmd.hfrom a header cmdTable.h.
  • 主程序,gen1
  • gen1- 接收发送到str2value进行处理的输入,输出结果str2value,使用“标记器”将输入分解为标记,确定对每个标记进行何种处理,并将它们传递给str2num, 或str2cmd。然后它返回一个结果数组。
  • str2num- 做一些处理
  • str2cmd- 同上
  • author.py- 一个从头生成str2cmd.c和生成的 python 脚本。str2cmd.hcmdTable.h

I'm pretty sure I have my includes right, I've checked a couple of times. I've also checked that there are no conditions #ifndefwrong in the headers.

我很确定我的包含是正确的,我已经检查了几次。我还检查#ifndef了标题中没有错误的条件。

Here is my Makefile:

这是我的 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

Here is the output I recieve from make all:

这是我从 make all 收到的输出:

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

Any suggestions about what this is about? STR2VALUESFILEShas all the object files I need, to define the missing functions.

关于这是关于什么的任何建议?STR2VALUESFILES拥有我需要的所有目标文件,以定义缺少的函数。

回答by Nikolai Fetissov

I think you are confused about how the compiler puts things together. When you use -cflag, i.e. no linking is done, the input is C++ code, and the output is object code. The .ofiles thus don't mix with -c, and compiler warns you about that. Symbols from object file are notmoved to other object files like that.

我认为您对编译器如何将事物组合在一起感到困惑。当您使用-c标志时,即不进行链接,输入是 C++ 代码,输出是目标代码。.o因此,这些文件不会与 混合-c,并且编译器会警告您这一点。目标文件中的符号不会像这样移动到其他目标文件中。

All object files should be on the final linker invocation, which is not the case here, so linker (called via g++front-end) complains about missing symbols.

所有目标文件都应该在最终的链接器调用上,这里不是这种情况,因此链接器(通过g++前端调用)会抱怨缺少符号。

Here's a small example (calling g++explicitly for clarity):

这是一个小例子(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)

There's also makedependutility that comes with X11 - helps a lot with source code dependencies. You might also want to look at the -Mgccoption for building makerules.

makedependX11还附带了实用程序 - 对源代码依赖性有很大帮助。您可能还想查看-Mgcc构建make规则的选项。