2011-04-13 166 views
4

我遇到了我的Makefile问题。在crt1.o函数中未定义对“main”错误的引用_start

我试图从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 [email protected] $< -lpcap 

clean: 
    rm *.o $(TARGET) 

modules.o: 
    $(CC) $(CFLAGS) -c modules.c -o [email protected] $< 

main.o: 
    $(CXX) $(CXXFLAGS) -c main.cpp -o [email protected] $< 

我已经包含了 “modules.h”,它包含了所有的函数声明,在我的main.cpp。 CFLAGS和CXXFLAGS变量指向包含

正确的路径当我尝试使用这个Makefile做,我得到的错误

/usr/lib/gcc/x86_64-redhat-linux/4.4.4 /../../../../lib64/crt1.o:在函数 '_start':
(的.text + 0×20):未定义参照 '主'

如果我切换我的$(TARGET)行中的modules.o和main.o的顺序,然后我得到错误,说“未定义的引用”,我已经在main.cpp modules.c中定义的函数。

我不知道什么是错的。

谢谢。

问候, 雷恩

+1

发表代码... – Nawaz 2011-04-13 08:36:19

+0

我有一个类似的问题,当我拼写'gcc -pipe'为'gcc -pie' ... – gregn3 2015-02-13 12:25:44

回答

1

这里有一对夫妇的提示:不需要.o文件

  1. -o [email protected] $<,所以从这些目标删除。
  2. -Wall在编译不链接时使用更有意义。所以我会将它添加到CCCXX行代替(或更好,到CFLAGSCXXFLAGS)。
  3. 干净的目标应该是.PHONY目标的依赖项,以便您可以始终执行它(无需事先检查更改的依赖项)。

如果您仍然收到关于从modules.c中缺少对函数的引用的错误,那么您可能会在main.cpp中缺少一些extern "C" ...语句。这是因为C++函数的内部名称的计算方式与C函数的内部名称不同(我认为C++在名称空间,类名称等前加上所有名称)。要告诉C++可以使用旧的内部名称进行链接来找到特定的函数,请使用extern“C”语句。

+0

谢谢extern“C”做的窍门! – Rayne 2011-04-13 08:55:14

8

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

+0

这解决了“未定义的主要参考”问题。但是现在我得到了“未定义的引用”,这是我在modules.c中定义的函数,在main.cpp错误中。在我的main.cpp中,我包含了modules.h,并在modules.c中声明了函数作为extern函数。 – Rayne 2011-04-13 08:43:19

+3

尝试使用g ++编译C代码(如果仅用于测试)。C++有一些有趣的名字可能会在这里碰撞。如果修复它,看看'extern“C”' – 2011-04-13 08:45:25

+0

谢谢,extern“C”做了诡计! – Rayne 2011-04-13 08:58:24

相关问题