我刚开始使用makefile,遇到了一个问题。(C++项目)
我正在尝试制作一个依赖链:
main.cpp依赖于a类,a类依赖于b类。
主要思想是使用allready编译的类b重新编译类a,而类a没有main()函数。(当修改a类时)
这是我的makefile:
生成文件
all: main.o
main.o: main.cpp classa.o
g++ main.cpp classa.o -o main.o
classa.o: classa.h classa.cpp classb.o
g++ -c classa.cpp classb.o -o classa.o
classb.o: classb.h classb.cpp
g++ -c classb.cpp -o classb.o
代码:
main.cpp
#include "classa.h"
int main() {
ClassA a;
return 0;
}
classa.h
#ifndef CLASSA_H
#define CLASSA_H
#include "classb.h"
class ClassA {
private:
ClassB b;
public:
ClassA();
};
#endif // CLASSA_H
classa.pp
#include "classa.h"
ClassA::ClassA() {
}
b.h类
#ifndef CLASSB_H
#define CLASSB_H
class ClassB {
public:
ClassB();
};
#endif // CLASSB_H
classb.cpp
#include "classb.h"
ClassB::ClassB() {
}
问题:
当我使用make-f makefile时,我得到以下错误:
g++ -c classb.cpp -o classb.o
g++ -c classa.cpp classb.o -o classa.o
g++: warning: classb.o: linker input file unused because linking not done
g++ main.cpp classa.o -o main.o
classa.o: In function `ClassA::ClassA()':
classa.cpp:(.text+0x18): undefined reference to `ClassB::ClassB()'
collect2: error: ld returned 1 exit status
makefile:4: recipe for target 'main.o' failed
make: *** [main.o] Error 1
我相信它是从使用参数-c重用classb.o开始的
对我来说,c是一个神奇的"当我编译没有main()函数的代码时使用"参数。
如果你能告诉我哪里出了问题,以及我想做的事情是否可行,我会很高兴。
问候,巧克力
您的makefile应该更像这样:
all: main
main: main.cpp classa.o classb.o
g++ main.cpp classa.o classb.o -o main
classa.o: classa.h classa.cpp
g++ -c classa.cpp -o classa.o
classb.o: classb.h classb.cpp
g++ -c classb.cpp -o classb.o
从.cpp
文件构建.o
文件,然后将.o
文件链接到最终输出(也是从.cpp
文件构建的)。
链接时需要列出所有相关的对象文件,而不需要在仅编译时列出它们(这是使用-c
标志时发生的情况,该标志告诉gcc
跳过链接步骤)。
这里的关键是classa.o
不依赖于classb.o
或classb.cpp
(它可能确实依赖于classb.h
,但在这种情况下,您可能希望将其添加到需求中)。完全链接的二进制依赖于它们两者,然后根据需要相互依赖。
也就是说,您可以通过不指定自己的规则而简单地使用内置规则来极大地简化上面的makefile。下面的makefile应该可以执行您想要的操作。
all: main
main: classa.o classb.o
classa.o: classa.h
classb.o: classb.h
如果以后需要自定义编译器/链接器标志,可以使用默认变量将其用于相应的行。请参阅10.3隐式规则使用的变量和10.2内置规则目录,了解变量以及使用它们的规则。