具有链依赖项的简单生成文件。 "linker input file unused because linking not done" 和 g++ -c
A simple makefile with chain dependencies. "linker input file unused because linking not done" and g++ -c
我刚开始使用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内置规则目录,了解变量以及使用它们的规则。
相关文章:
- 叮当声:折叠表情和"expression result unused"警告
- Win32 API - HWND "{unused = ???} Unable to read memory"错误
- Clang 对使用的类型别名发出"unused type alias"警告
- 标准::可选与 "unused/default"值
- 禁用作用域防护的"Unused variable"
- C++ 中的错误"expression result is unused"
- C++编译器错误"cannot be thread-local because it has non-POD type""
- 错误:变量"cannot be implicitly captured because no default capture mode has been specified"
- 禁用特定函数名称的"unused function"
- C# DLL 导入失败:"The application has failed to start because its side-by-side configuration is incorrect
- CC1加:"-Wno-unused-result"错误
- GCC:变量属性"__unused__"与仅"unused"
- 具有链依赖项的简单生成文件。 "linker input file unused because linking not done" 和 g++ -c
- "Because" "use" ;C++
- 我在Visual Studio中运行了一个Qt C++项目,但缺少"the program can not start because QtCored4.dll"
- Xcode 系统使用C++清除并"expression result unused"错误
- 当所有 Windows 应用尝试使用 TCP 套接字时,我的应用导致错误 - 收到"operation on a socket could not be performed because..." (
- 我如何才能最好地将' __attribute__ ((unused)) '应用于这些自动生成的对象
- gcc中的C++11样式[[unused]]属性
- C++:如何从已知"point"开始找出"unused"类