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
Linker error: "linker input file unused because linking not done", undefined reference to a function in that file
提问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 tostr2value
for processing, outputs resultsstr2value
, breaks input into tokens using "tokenizer" determines what sort of processing to do to each token, and passes them off tostr2num
, orstr2cmd
. It then returns an array of the results.str2num
- does some processingstr2cmd
- dittoauthor.py
- a python script that generatesstr2cmd.c
andstr2cmd.h
from a headercmdTable.h
.
- 主程序,
gen1
。 gen1
- 接收发送到str2value
进行处理的输入,输出结果str2value
,使用“标记器”将输入分解为标记,确定对每个标记进行何种处理,并将它们传递给str2num
, 或str2cmd
。然后它返回一个结果数组。str2num
- 做一些处理str2cmd
- 同上author.py
- 一个从头生成str2cmd.c
和生成的 python 脚本。str2cmd.h
cmdTable.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 #ifndef
wrong 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? STR2VALUESFILES
has 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 -c
flag, i.e. no linking is done, the input is C++ code, and the output is object code. The .o
files 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 makedepend
utility that comes with X11 - helps a lot with source code dependencies. You might also want to look at the -M
gcc
option for building make
rules.
makedepend
X11还附带了实用程序 - 对源代码依赖性有很大帮助。您可能还想查看-M
gcc
构建make
规则的选项。