我编写了一个完整的程序及其makefile,唯一的麻烦就是我必须知道如何实现调试器。我一直在网上看类似的问题,但无济于事。
这是我的makefile:
# the variable CC is the compiler to use.
CC=gcc
# the variable CFLAGS is compiler options.
CFLAGS=-c -Wall
assign4: main1.o ObjectManager.o
$(CC) main1.o ObjectManager.o -o assign4
main1.o: main1.c ObjectManager.h
$(CC) $(CFLAGS) main1.c
ObjectManager.o: ObjectManager.c ObjectManager.h
$(CC) $(CFLAGS) ObjectManager.c
clean:
rm -rf *o assign4
我试图调整CFLAGS:到-g Wall,但它只是说:
架构x86_64的未定义符号: “_main”,引自: 主要可执行文件的隐式输入/启动 ld:找不到架构x86_64的符号 clang:错误:链接器命令失败,退出代码为1(使用-v查看调用) make:*** [ObjectManager.o]错误1
有任何解决此问题的建议吗?
答案 0 :(得分:2)
看看这条规则:
ObjectManager.o: ...
$(CC) $(CFLAGS) ObjectManager.c
如果CFLAGS
是-c -Wall
,则-c表示gcc将编译源文件,但不会尝试链接它。 这正是用于生成目标文件而非可执行文件的目的。这样做的一个结果是源dile(ObjectManager.c
)不需要包含main
函数 - 编译器信任您在链接时提供一个。
但如果CFLAGS
为-g -Wall
,则-g 不暗示-c。因此,gcc将尝试创建可执行文件,并在main
不存在时中止。
解决方案:
CFLAGS := -Wall -g # the -g can be added with a conditional if you like
ObjectManager.o: ...
$(CC) $(CFLAGS) -c ObjectManager.c