问题描述
||
我的Makefile遇到问题。
我正在尝试从2个文件创建一个程序-包含main函数的main.cpp和包含main()中调用的函数的定义的modules.c。 modules.c仅包含函数定义,不包含主函数。
我的Makefile如下:
CC := gcc
CXX := g++
LINK := g++ -Wall
CFLAGS := -g
CXXFLAGS := -g
TARGET = program
$(TARGET): modules.o main.o
$(LINK) -o $@ $< -lpcap
clean:
rm *.o $(TARGET)
modules.o:
$(CC) $(CFLAGS) -c modules.c -o $@ $<
main.o:
$(CXX) $(CXXFLAGS) -c main.cpp -o $@ $<
我在main.cpp中已包含\“ modules.h \”,其中包含所有函数声明。 CFLAGS和CXXFLAGS变量指向包含以下内容的正确路径
当我尝试使用此Makefile时,出现错误
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/../../../../lib64/crt1.o:在函数\'_ start \'中:
(.text + 0x20):对\'main \'的未定义引用
如果在$(TARGET)行中切换modules.o和main.o的顺序,那么我会得到错误消息,说“未定义引用”是在main.cpp中modules.c中定义的函数。
我不知道怎么了。
谢谢。
问候,
雷恩
解决方法
这里有一些提示:
.o文件不需要
-o $@ $<
,因此请将其从这些目标中删除。
while2ѭ在编译时不链接时更有意义。因此,我将其添加到CC
和CXX
行(或者更好的是将其添加到CFLAGS
和CXXFLAGS
)。
clean目标应该是“ 7”目标的依赖项,以便您可以始终执行它(无需先前检查已更改的依赖项)。
如果仍然收到关于在modules.c中缺少对函数的引用的错误,则可能是在main.cpp中缺少了一些“ 8”语句。那是因为C ++函数的内部名称与C函数的内部名称计算方法不同(我认为C ++在所有名称之前都使用名称空间,类名称等)。要告诉C ++使用旧的内部名称进行链接可以找到特定的功能,请使用extern \“ C \”语句。
,使用$ ^代替$ <。后者仅包含第一个依赖项(modules.o),因此main.o未链接到可执行文件中。