crt1.o函数_start中对'main'错误的未定义引用

时间:2011-04-13 08:33:19

标签: c++ c makefile

我的Makefile出现问题。

我正在尝试从2个文件创建程序 - main.cpp包含main函数,modules.c包含main()中调用的函数的定义。 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中定义的函数的“未定义引用”。

我不知道出了什么问题。

谢谢。

此致 莱恩

2 个答案:

答案 0 :(得分:8)

使用$ ^而不是$&lt;。后者只包含第一个依赖项(modules.o),因此main.o没有链接到可执行文件中。

答案 1 :(得分:2)

以下是一些提示:

    .o文件不需要
  1. -o $@ $<,因此请从这些目标中删除它。
  2. 在编译不链接时使用
  3. -Wall更有意义。因此,我会将其添加到CCCXX行(或更好地添加到CFLAGSCXXFLAGS)。
  4. clean目标应该是.PHONY目标的依赖项,以便您可以始终执行它(不事先检查更改的依赖项)。
  5. 如果您仍然从modules.c中得到关于缺少对函数的引用的错误,那么您可能在main.cpp中缺少一些extern "C" ...语句。那是因为C ++函数的内部名称的计算方式与C函数的内部名称不同(我认为C ++前缀所有名称都带有命名空间,类名等)。要告诉C ++使用旧的内部名称进行链接可以找到特定的函数,请使用extern“C”语句。

相关问题