提前道歉,我相信这是一个非常简单的问题,但我一直无法找到解决方法。我正在组建一个非常简单的 C++
项目,但在适当使用头文件方面遇到了麻烦。
目录结构如下:
.
├── mainGraph
│ └── hnsw.cpp
└── utils
├── distances.cpp
└── distances.h
距离头文件 (
distances.h
):#ifndef DISTANCES
#define DISTANCES
#include <vector>
enum class Metric { Cosine, Euclidean};
double distance(const std::vector<double>& A, const std::vector<double>& B, Metric metric);
double similarity(const std::vector<double>& A, const std::vector<double>& B, Metric metric);
#endif
最后是
hnsw.cpp
文件:#include "../utils/distances.h"
#include <vector>
#include <iostream>
int main(){
std::vector<double> A = {0.1, 0.5, 0.7, 1.1};
std::vector<double> B = {0.5, 0.3, 0.8, 0.9};
std::cout << distance(A, B, Metric::Cosine) << '\n';
}
现在,当我尝试使用以下命令编译hnsw.cpp
时:g++ hnsw.cpp --std=c++11
,我会得到以下错误:
Undefined symbols for architecture x86_64:
"distance(std::__1::vector<double, std::__1::allocator<double> > const&, std::__1::vector<double, std::__1::allocator<double> > const&, Metric)", referenced from:
_main in hnsw-ad0e05.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
如果我将主函数移动到distances.cpp
文件中,则一切都可以正常工作。为了简洁起见,我不会发布整个文件,因为它很大,而且我相当确定它并不相关。如果有任何关于理解此处的一般流程的资源,那也会非常有帮助。
make
将为您免费完成的。 - Kerrek SB