为什么我的多文件编译的玩具示例不能编译?

时间:2011-10-09 22:58:55

标签: c++ g++ makefile

我一直在使用我从互联网上继承的makefile足够长的时间!现在是时候学习一劳永逸地编写自己的项目了。所以我已经阅读了一些教程并将模型拼凑在一起。它不起作用,我现在在我的智慧结束(这通常是我来到你的时候)。

像往常一样,提前感谢所有人,因为他们知识渊博。

lib.h

#ifndef LIB_H
#define LIB_H

/** returns the integer zero (0), because the 
 * 0 key on my keyboard is broken. 
 * @pre my keyboard is broken 
 * @post nope, still broken
 * @returns 0 */
int zero();

#endif

lib.cpp

#include "lib.h"

int zero() {

  return 0;
}

project.cpp

#include "lib.h"

int main () {

  int i = zero();

  return 0;
}

生成文件 (箭头是制表符)

project: lib.o project.o
-->g++ lib.o project.o -o project

project.o: project.cpp lib.h
-->g++ -c project.cpp

lib.o: lib.cpp lib.h
-->g++ -c lib.cpp

从命令行开始,我运行

$ make

我收到以下错误:

g++ project.cpp
/tmp/ccWCSqSx.o: In function 'main':
project.cpp:(.text+0x9): undefined reference to 'zero()'
collect2: ld returned 1 exit status
make: *** [project.o] Error 1

这显然是我错过了一些重要的信息。我用谷歌搜索了一堆,但大多数结果都是真正有问题的人,而我却无法了解缺少的东西。期待着答案非常尴尬,

谢谢!

2 个答案:

答案 0 :(得分:2)

错误消息提供命令行:

g++ project.cpp

注意缺少-c。尽管你的想法很明显,但这显然不在你的makefile中。

答案 1 :(得分:2)

看看你的错误答案:

g++ project.cpp

我能够通过这样做来复制你的错误。

您需要运行 g++ -c 。这是在你发布的Makefile中列出的,但我认为这是你实际使用的那个。如果没有-c,链接器将尝试链接从cpp文件创建的目标文件。如果是这样,它将找不到外部依赖项,例如zero()函数。