gpt4 book ai didi

c++ - 具有链依赖性的简单 makefile。 "linker input file unused because linking not done"和 g++ -c

转载 作者:行者123 更新时间:2023-11-28 02:38:26 24 4
gpt4 key购买 nike

我刚开始使用 makefile 时遇到了一个问题。 (C++项目)
我正在尝试制作依赖链:

main.cpp依赖于class a。并且 a 类依赖于 b 类。

主要思想是使用已经编译好的b类重新编译a类,而a类没有main()函数。 (修改a类时)

这是我的生成文件:

生成文件

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

和代码:

主要.cpp

#include "classa.h"

int main() {
ClassA a;
return 0;
}

类.h

#ifndef CLASSA_H
#define CLASSA_H

#include "classb.h"

class ClassA {
private:
ClassB b;
public:
ClassA();
};

#endif // CLASSA_H

类.cpp

#include "classa.h"

ClassA::ClassA() {
}

类b.h

#ifndef CLASSB_H
#define CLASSB_H

class ClassB {
public:
ClassB();
};

#endif // CLASSB_H

类b.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

你构建 .o来自 .cpp 的文件文件然后链接.o文件到最终输出(也是从 .cpp 文件构建)。

您需要在链接时列出所有相关的目标文件,而仅在编译时不需要列出它们(当您使用 -c 标志告诉 gcc 跳过链接步骤时会发生这种情况)。

这里的关键是 classa.o 取决于classb.oclassb.cpp (它可能确实取决于 classb.h,但在这种情况下您可能希望将其添加到要求中)。完全链接的二进制文件依赖于它们两者,然后它们根据需要相互依赖。

也就是说,您可以通过不指定自己的规则并仅使用内置规则来显着简化上述 makefile。下面的 makefile 应该做你想做的。

all: main

main: classa.o classb.o

classa.o: classa.h
classb.o: classb.h

如果您稍后需要自定义编译器/链接器标志,您可以使用默认变量在适当的行上使用它们。参见 10.3 Variables Used by Implicit Rules10.2 Catalogue of Built-In Rules变量以及使用它们的规则。

关于c++ - 具有链依赖性的简单 makefile。 "linker input file unused because linking not done"和 g++ -c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26784804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com