链接器输入文件未使用,因为链接未完成,我无法获得.o

linker input file unused because linking not done, I can't get .o

本文关键字:链接 因为 输入 文件 未使用 未完成      更新时间:2023-10-16

我有一个二叉树的模板类,tree.tpp 和 tree.h。我已经对类进行了测试,但无法编译

#include <cstdlib>
#include <iostream>
#include "arbolbinario.h"
using namespace std;
int main(int argc, char** argv) {
ArbolBinario<int> pila(45);

return 0;
}

当我这样做时,我遇到了以下错误:g++ -c -o ./tree.o ./tree.tpp -I ./tree.h

g++:警告:./tree.tpp:链接器输入文件未使用,因为链接未完成

(我正在使用网络豆(

.tpp不是g++识别的文件结尾之一,请参阅其文档。

因此,g++假定您希望将文件直接传递到链接器。但是,由于您使用了-c标志(该标志指示您希望g++仅编译而不调用链接器(,因此会收到该错误消息。

解决方案是告诉g++您显式传递它的文件类型:

g++ -c -o ./tree.o -x c++ ./tree.tpp -I ./tree.h

或者,更好的是,重命名C++源文件,使用C++源文件的常见文件结尾之一,例如.cpp.cc.cxx等这将减少构建工具的麻烦,并减少其他人查看您的项目的困惑。


正如问题评论中所述-I ./tree.h显然也是错误的,但不是这个特定错误的原因(可能它根本不属于那里(。


但是

如果你的.tpp包含类模板的方法的实现,那么你不应该重命名它(在这种情况下.tpp是合适的(,但也不应该把它编译为翻译单元。这意味着它不应该出现在任何g++命令中。

.tpp实现模板类方法的文件需要包含在.h文件中,而应改为包含类模板定义。否则,稍后尝试链接文件时会出现链接器错误,请参阅为什么只能在头文件中实现模板?。

-c标志告诉 GCC 只编译输入源文件,执行任何链接。

如果希望编译器将目标文件链接到可执行二进制文件,则需要删除-c标志。