生成文件错误:未定义对 main 的引用
makefile error: undefined reference to main
我正在尝试使用make编译我的代码段。通常我像这样编译我的代码:
mipsisa32r2el-timesys-linux-gnu-g++ -o testing -I/usr/include/libxml2 -L/develop/xc4/rootfs/parsecpp/lib -L/develop/xc4/rootfs/parsecpp/sqlite-mips2/lib -I/develop/xc4/rootfs/parsecpp/sqlite-mips2/include db.cpp main.cpp networkinterfacemodule.cpp network.cpp multiplex.cpp program.cpp service.cpp -lsqlite3 -lxml2
为了摆脱这个长命令,我尝试编写一个 makefile:
CC= mipsisa32r2el-timesys-linux-gnu-g++
export LD_LIBRARY_PATH=:/parsecpp/sqlite-mips2/lib:/parsecpp/lib:/tmp/vixs_temp/DirectFB/single_core/lib
CFLAGS=-I/usr/include/libxml2 -I/develop/xc4/rootfs/parsecpp/sqlite-mips2/include
LDFLAGS=-L/develop/xc4/rootfs/parsecpp/lib -L/develop/xc4/rootfs/parsecpp/sqlite-mips2/lib
LIBS = -lsqlite3 -lxml2
PROG=testing
all: main.o db.o mod.o multiplex.o network.o networkinterfacemodule.o program.o service.o
$(CC) -o $(PROG) $(CFLAGS) $(LDFLAGS) main.o db.o mod.o multiplex.o network.o networkinterfacemodule.o program.o service.o $(LIBS)
main.o: main.cpp
$(CC) $(CFLAGS) $(LDFLAGS) main.cpp db.cpp networkinterfacemodule.cpp mod.cpp multiplex.cpp network.cpp program.cpp service.cpp $(LIBS)
db.o: db.cpp
$(CC) $(CFLAGS) $(LDFLAGS) db.cpp $(LIBS)
mod.o: mod.cpp
$(CC) $(CFLAGS) $(LDFLAGS) mod.cpp $(LIBS)
multiplex.o: multiplex.cpp
$(CC) $(CFLAGS) $(LDFLAGS) multiplex.cpp $(LIBS)
network.o: network.cpp
$(CC) $(CFLAGS) $(LDFLAGS) network.cpp $(LIBS)
networkmoduleinterface.o: networkinterfacemodule.cpp
$(CC) $(CFLAGS) $(LDFLAGS) networkinterfacemodule.cpp $(LIBS)
program.o: program.cpp
$(CC) $(CFLAGS) $(LDFLAGS) program.cpp $(LIBS)
service.o: service.cpp
$(CC) $(CFLAGS) $(LDFLAGS) service.cpp $(LIBS)
clean:
rm -rf *o testing
然后我得到这个错误:
/opt/timesys/linux-gnu/toolchain/bin/../../toolchain/lib/crt1.o: In function `__start':
(.text+0xc): undefined reference to `main'
/opt/timesys/linux-gnu/toolchain/bin/../../toolchain/lib/crt1.o: In function `__start':
(.text+0x10): undefined reference to `main'
collect2: ld returned 1 exit status
make: *** [db.o] Error 1
有人可以帮助我吗?
每当只是编译文件而不链接文件时,请使用"-c"标志。
例如:-
db.o: db.cpp
$(CC) -c $(CFLAGS) $(LDFLAGS) db.cpp $(LIBS)
此外,在编译时,无需向编译器提供"$(LIBS)",只需在链接时提供它们。也不需要链接器标志,因为使用"-c"标志时不会调用链接器。
所以你可以写,
db.o: db.cpp
$(CC) -c $(CFLAGS) db.cpp
已更新(基于评论):-
链接文件时,链接器需要一个且只有一个main
函数。在上述情况下,main 函数未在 db.cpp
中定义,因此尽管编译成功,但链接器会抛出错误,因为它找不到main
函数。
当你在没有 -c 标志的情况下编译时,gcc 会尝试链接程序。由于主函数很可能在 main.c 中而不是在 db.c 中,因此在 db.c 中搜索主函数时链接器会失败。这意味着您需要告诉编译器,您只需要尚未链接但转换为目标文件的输出,这正是 -c 标志所做的。
这导致了Rajatkhanduja所说的:
db.o: db.cpp
$(CC) -c $(CFLAGS) db.cpp
我想你错过了链接规则。
你应该有一个第一条规则告诉如何链接:
testing_OBJECTS = main.o db.o mod.o multiplex.o network.o networkinterfacemodule.o program.o service.o
testing$(EXEEXT): $(testing_OBJECTS)
ld $(testing_OBJECTS) $(LDFLAGS) $(LIBS)
而这个规则必须是all
的前提:
all: testing$(EXEEXT)
此外,由于所有"*.o:*.cpp"规则都是相同的,因此您可以指定单个规则并让make
替换文件名。询问您是否想要更多数据。
相关文章:
- C++/生成文件错误:未定义对"main"的引用
- 在 Linux 上编译 - 在函数 '_start' 中:(.text+0x20):对 'main' 的未定义引用
- C++错误:在类中取消对main的定义引用
- 无法引用.cpp中的函数,以及 main 中的 .h 文件。C++
- crt1.o:在函数"_start"中:(.text+0x20):对"main"的未定义引用
- 未解析的外部符号__imp_glewInit函数 main 中引用
- main.cpp:(.text+0x8ea):在C++中未定义的引用
- 如何编写一个 void 函数,该函数将在数组中搜索值,并通过引用将该值的位置传递回 main 函数
- main.cpp:(.text+0x8f):对[对象方法]的未定义引用
- Xcode 给出 Mach-O 链接器错误:"_JNI_CreateJavaVM",引用自:main.o 中的_main
- 如何在 main 中使用包含对节点的引用调用函数
- 从 crt1.o 对 main 的未定义引用
- 对"main"的未定义引用 - 但包括 main 函数
- main.cpp :(.text 0x5f):未定义的引用
- 尝试使用 MinGW 编译 Assembly + C++:ccqKAvXJ.o:main.cpp:(.text+0x18):对 'GetMagicNumber' 的未定义引用
- 为什么我的指针在 main 中取消引用后具有不同的值,而不是在我自己的自定义函数中取消引用它时?
- 在Linux上使用makefile,使用Boost和MPI对"main"的未定义引用
- QT Subdir-未定义对main的引用-错误
- C++声明"main"作为对功能的引用?
- 生成文件错误:未定义对 main 的引用