我正在尝试使用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
有人能帮助我吗?
答案 0 :(得分:18)
每当您只是编译文件而不是链接它时,请使用“-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
函数而抛出错误。
答案 1 :(得分:2)
当你在没有-c标志的情况下编译时,gcc会尝试链接程序。由于main函数很可能在main.c而不是db.c中,因此链接器在db.c中搜索main函数时会失败。这意味着您需要告诉编译器您只需要尚未链接的输出,而是转换为目标文件,这正是-c标志所做的。
这导致rajatkhanduja说:
db.o: db.cpp
$(CC) -c $(CFLAGS) db.cpp
答案 2 :(得分:0)
我猜你错过了链接规则。
你应该有第一条规则告诉如何链接:
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
替换文件名。
询问您是否需要更多数据。