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

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

我有一个二叉树模板 class,tree.tpp 和 tree.h。我用 class 做了一个测试,但我无法编译它

#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:链接器输入文件未使用,因为链接未完成

(我正在使用 netbeans)

-c 标志告诉 GCC 只编译输入源文件,做任何linking。

如果您希望编译器link将目标文件转换为可执行二进制文件,您需要删除-c标志。

.tpp 不是 g++ 识别的文件结尾之一,请参阅 its documentation

因此g++假设您希望将文件直接传递给linker。但是因为你使用了 -c 标志,这表明你希望 g++ 只编译,但是 而不是 调用 linker,你明白了错误信息。

解决方法是明确地告诉g++你传递的是什么类型的文件:

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

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


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


然而:

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

.tpp 实现模板 classes 方法的文件需要包含在具有 class 模板定义的 .h 文件中。否则,稍后当您尝试 link 您的文件时会出现 linker 错误,请参阅 Why can templates only be implemented in the header file?