找不到 ld 符号
ld symbol not found
环顾四周,发现了一些类似的问题,但没有一个是相同的。 大多数与构造函数或析构函数有关。 这个问题很可能是我生锈的C++链接器记忆的结果(几年后又把它捡回来)。
我会保持它非常简单,因为这可能是对链接器的基本误解:
数据.h
#pragma once
namespace test {
class Data_V1 {
public:
// some getters/setters
int getData() { return _d; }
void setData( int d ) { _d = d; }
private:
// some data
int _d;
};
}
建造者.h
#pragma once
namespace test {
template <class V>
class Builder {
public:
void build();
};
}
建造者.cpp
#include <iostream>
#include "builder.h"
namespace test {
template<class V>
void Builder<V>::build() {
std::cout << "Insert building logic" << std::endl;
}
}
主.cpp
#include "builder.h"
#include "data.h"
using namespace test;
int main(int argc, char* argv[]) {
Builder<Data_V1> b;
b.build();
}
编译:
g++ -Wall -ansi -pedantic -c builder.cpp
g++ -Wall -ansi -pedantic -c main.cpp
g++ -Wall -ansi -pedantic -o main main.o builder.o
链接错误:
Undefined symbols for architecture x86_64:
"test::Builder<test::Data_V1>::build()", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
任何帮助将不胜感激!
模板定义需要对所有翻译单元可见。将定义从cpp
移动到标题。
Builder.h
#pragma once
namespace test {
template <class V>
class Builder {
public:
void build();
};
template<class V>
void Builder<V>::build() {
std::cout << "Insert building logic" << std::endl;
}
}
在你问之前,不,除非你事先知道所有可能的专业化,否则没有办法隐藏实现。
模板表示用于创建新类的通用形式。如果实现不可见,则当您尝试专用化模板时,编译器无法知道要生成什么代码。
相关文章:
- LD:尝试编译项目时找不到架构x86_64符号
- 在OSx:ld上使用CMake构建C++项目:找不到体系结构x86_64的符号
- C++ XCODE ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -
- /usr/bin/ld: /tmp/cc9zxSDP.o: 对符号的未定义引用
- 编译问题LD:不满意的符号
- ld:Xcode 中架构x86_64的 1 个重复符号
- MacOS LD:找不到符号(x86_64)
- C++编译错误:ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v
- ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- OSX CGGetActiveDisplayList -> ld:找不到体系结构x86_64的符号
- OSX MOJAVE -LD:架构X86_64 clang找不到符号:错误:链接器命令失败,出口代码1
- LD:架构x86_64 clang找不到符号:错误:链接器命令失败,出口代码1(使用-v to See
- 英特尔 MKL 和 JNI:如何添加 ld 从中搜索符号的共享库?
- GCC LD:构造I386找不到符号
- 尽管存在符号链接,但 ld 无法加载库
- 无法导出mexfunction:符号未定义的collect.exe2.exe:错误:ld返回1退出状态
- ld:对于架构x86_64 row :: AddColumn找不到的符号
- GCC:Get LD:对于架构X86_64在OS X 10.11.5上找不到的符号
- ld:1 个重复符号用于架构x86_64 clang: 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- 体系结构x86_64的未定义符号;ld:找不到体系结构x86_64的符号