模板类继承链接器错误
Template class inheritance linker errors
假设我有一个类模板A
,非模板类B
继承自A
。虽然A
编译正常,但编译B
会触发链接器错误。具体说来
A.hpp
#ifndef A_HPP_INCLUDED
#define A_HPP_INCLUDED
template <typename T>
class A {
public:
A();
A(A<T>&& );
virtual ~A();
/* ... */
protected:
T x;
};
#include A.tpp
#endif
A.tpp
#include "A.hpp"
template <typename T>
A<T>::A() { ... }
template <typename T>
A<T>::A(A<T>&& other)
: x(std::move(other.x)) { }
template <typename T>
A<T>::~A() { ... }
测试A.cpp
#include "A.hpp"
int main() {
A<std::string> a;
/* ... */
return 0;
}
按如下方式编译testA.cpp
成功:
$ g++ -std=c++11 testA.cpp
<- 确定
接下来是从A
继承的非模板class B
:
B.马力
#ifndef B_HPP_INCLUDED
#define B_HPP_INCLUDED
#include "A.hpp"
class B
: public A<std::string> {
public:
B();
virtual ~B();
static A<std::string> foo();
};
#endif
B.cpp
#include "B.hpp"
B::B()
: A(std::move(foo())) { }
B::~B() { }
A<std::string> B::foo() { ... }
测试B.cpp
#include "B.hpp"
int main() {
B b;
/* ... */
return 0;
}
testB.cpp
的编译似乎还可以,但链接器不是一个快乐的露营者:
尝试 1
$ g++ -std=c++11 testB.cpp
Undefined references to B(), and ~B()
collect2: error: ld returned 1 exit status
尝试 2
$ g++ -std=c++11 testB.cpp B.cpp
Undefined reference to B.foo()
collect2: error: ld returned 1 exit status
任何帮助/想法都非常感谢。 先生 ld
让我彻夜难眠,并威胁着我的理智。
编辑
谢谢迈克·西摩!这个最小的例子并不是真实代码的真正演绎,因为实现中确实缺少限定符,并且是齿轮中的扳手。
我建议你用两个不同的传递进行编译和链接:
g++ -c -std=c++11 -o B.o B.cpp
g++ -c -std=c++11 -o TestB.o TestB.cpp
g++ -o test.exe B.o TestB.o
如果我的建议中断了,至少会清楚哪里缺少什么,您将能够使用 nm
调试单个对象文件。
在实际代码中,ParsedData::parsedStream
是一个模板,因此应该在标头中定义,以便它在每个可能需要实例化的翻译单元中都可用。
此外,即使在.cpp
文件中也没有定义它,因为您省略了ParsedData::
限定符,而是在命名空间范围内声明了不同的模板。
$ g++ -std=c++11 testB.cpp
Undefined references to B(), and ~B()
这个显然是错误的(我只是这么说,因为我不明白你为什么要做这个尝试)。仅编译一个翻译单元,该翻译单元使用在另一个未编译的 (B.cpp) 中定义的符号。
我认为您应该在testB中发布...
背后的实际内容.cpp以帮助找到问题。它可能在您使用foo()
通过预期:由于foo
是类的静态成员方法,因此您在测试中的调用应如下所示:
B::foo();
相关文章:
- Netbeans 10:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- CMake 错误:链接器命令失败,退出代码为 1 和 cpp.o 文件
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 如何修复 clang: 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- Android NDK.Build命令失败.未定义的引用.clang++:错误:链接器命令失败,退出代码为1
- 使用cmake错误链接boost日志
- 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用):在 Macbook 上
- C++ XCODE ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -
- clang:错误:链接器命令失败,C++代码中的退出代码为 1(使用 -v 查看调用)
- 静态库中的 g++ 错误链接函数
- 未定义的参考错误链接天然函数Android
- C++编译错误:ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v
- QT Q_PROPERTY错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- OSX MOJAVE -LD:架构X86_64 clang找不到符号:错误:链接器命令失败,出口代码1
- C 错误链接器命令失败了出口代码1(使用-V查看调用)
- LD:架构x86_64 clang找不到符号:错误:链接器命令失败,出口代码1(使用-v to See
- 聚输出错误 - 链接列表
- Xcode链接器错误:链接器命令失败,退出代码为1(使用-v查看调用)
- 尝试构建C DLIB示例无法与数百个未定义的参考错误链接