我的Makefile有问题 .
我正在尝试从2个文件创建程序 - main.cpp包含main函数,modules.c包含main()中调用的函数的定义 . modules.c只包含函数定义,没有main函数 .
我的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):未定义的引用'主'
如果我在$(TARGET)行中切换modules.o和main.o的顺序,那么我得到的错误是“未定义引用”我在modules.c中定义的函数,在main.cpp中 .
我不知道出了什么问题 .
谢谢 .
此致,Rayne
2 回答
以下是一些提示:
.o文件不需要
-o $@ $<
,因此请从这些目标中删除它 .在编译不链接时使用
-Wall
更有意义 . 所以我会将它添加到CC
和CXX
行(或者更好地添加到CFLAGS
和CXXFLAGS
) .clean目标应该是
.PHONY
目标的依赖项,以便您可以始终执行它(不事先检查更改的依赖项) .如果你仍然从modules.c中得到关于缺少对函数的引用的错误,那么你可能在main.cpp中缺少一些
extern "C" ...
语句 . 这是因为C函数的内部名称的计算方式与C函数的内部名称不同(我认为C前缀所有名称都带有命名空间,类名等) . 要告诉C使用旧的内部名称进行链接可以找到特定的函数,请使用extern "C"语句 .使用$ ^而不是$ < . 后者仅包含第一个依赖项(modules.o),因此main.o未链接到可执行文件中 .