首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中的头文件出错:链接器命令失败

C++中的头文件出错:链接器命令失败
EN

Stack Overflow用户
提问于 2017-03-28 22:37:30
回答 2查看 913关注 0票数 4

提前道歉是一个非常简单的问题,但我一直未能找到解决办法。我将一个非常简单的C++项目放在一起,但在适当地使用头文件时遇到了问题。

目录结构如下:

代码语言:javascript
复制
.
├── mainGraph
│   └── hnsw.cpp
└── utils
    ├── distances.cpp
    └── distances.h

距离头文件(distances.h):

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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,我得到以下错误:

代码语言:javascript
复制
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文件中,那么一切都会顺利进行。为了简洁起见,我不会发布整个文件,因为它是相当大的,而且我相当肯定它与此无关。如果这里有任何关于理解一般过程的资源,那也将是非常有帮助的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-28 22:42:10

如果您不想为以后的链接构建单独的对象文件,而是一次性构建整个可执行文件,则需要在命令行中指定所有参与的转换单元:

代码语言:javascript
复制
g++ -std=c++11 hnsw.cpp ../utils/distances.cpp

除非您还使用a.out标志覆盖该名称,否则输出文件将被称为-o

通常,您需要分别编译翻译单元,并在单独的步骤中链接它们:

代码语言:javascript
复制
g++ -std=c++11 mainGraph/hnsw.cpp -c -o mainGraph/hnsw.o
g++ -std=c++11 utils/distances.cpp -c -o utils/distances.o

g++ -std=c++11 mainGraph.hnsw.o utils/distances.o -o myprog

您也不会手动维护这些命令,而是将它们放入Makefile或一些类似的构建系统中。关键是,您不需要仅仅因为更改了源代码的某些部分而重新编译没有更改的翻译单元。

票数 5
EN

Stack Overflow用户

发布于 2017-03-28 22:43:20

当您运行g++ hnsw.cpp --std=c++11时,您告诉编译器编译hnsw.cpp并将输出与c++标准库链接以创建一个可执行文件。链接器无法找到distances的实现,因为它位于distances.cpp中。

您需要编译这两个文件并将它们链接到一起。实现这一点的方法有很多种,但最简单的方法是在调用gcc时指定这两个源文件,如下所示:

代码语言:javascript
复制
g++ -std=c++11 hnsw.cpp ../utils/distances.cpp
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43081164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档