继承时体系结构x86_64的未定义符号

Undefined symbols for architecture x86_64 when inheriting

本文关键字:未定义 符号 体系结构 x86 继承      更新时间:2023-10-16

我有一个C++代码,我试图使用继承来重用我的代码。但是当我编写代码时,我会得到以下错误:

体系结构x86_64的未定义符号:"QuickUnion::QuickUnion(int)",引用自:_main in mainld:找不到体系结构x86_64 的符号

clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

制造商:***[a.out]错误1

我的制作文件

CC = g++
CFLAGS = -std=c++11 -Wall -c
LFLAGS = -std=c++11 -Wall
DEBUG = -g
OBJS = main.o unionfind/UnionFind.o unionfind/QuickUnion.o
a.out: $(OBJS)
    $(CC) $(LFLAGS) $(OBJS) $(DEBUG)
main.o: main.cpp
    $(CC) $(CFLAGS) main.cpp $(DEBUG)
unionfind/QuickUnion.o: unionfind/UnionFind.h unionfind/QuickUnion.h unionfind/QuickUnion.cpp
    $(CC) $(CFLAGS) unionfind/QuickUnion.cpp $(DEBUG)
unionfind/UnionFind.o: unionfind/UnionFind.h unionfind/UnionFind.cpp
    $(CC) $(CFLAGS) unionfind/UnionFind.cpp $(DEBUG)

UnionFind.h和.cpp:

#ifndef UNIONFIND_H
#define UNIONFIND_H
#include <vector>
class UnionFind {
protected:
    int connectedComponents;
    std::vector<int> parents;
public:
    UnionFind(int);
    virtual void connect(int, int) = 0;
    virtual int find(int) = 0;
    bool connected(int, int);
    int count();
};
#endif
...
#include "UnionFind.h"
UnionFind::UnionFind(int size): parents(size) {
    connectedComponents = size;
    for (int i = 0; i < size; i++) {
        parents[i] = i;
    }
}
bool UnionFind::connected(int p, int q) {
    return find(p) == find(q);
}
int UnionFind::count() {
    return connectedComponents;
}

QuickUnion.h和.cpp:

#ifndef QUICKUNION_H
#define QUICKUNION_H
#include <vector>
#include "UnionFind.h"
class QuickUnion: public UnionFind {
public:
    QuickUnion(int);
    void connect(int, int);
    int find(int);
};
#endif
...
#include "QuickUnion.h"
QuickUnion::QuickUnion(int size): UnionFind(size) {
}
void QuickUnion::connect(int p, int q) {
    int pRoot = find(p);
    int qRoot = find(q);
    if (pRoot == qRoot) {
        return;
    }
    parents[pRoot] = qRoot;
    connectedComponents--;
}
int QuickUnion::find(int p) {
    while (p != parents[p]) {
        p = parents[p];
    }
    return p;
}

main.cpp

#include <iostream>
#include "unionfind/QuickUnion.h"
using namespace std;
int main() {
    QuickUnion qu(10);
    cout << "Count:" << endl;
    cout << qu.count();
}

也许这与构造函数有关,但我既不知道为什么会发生这个错误,也不知道如何纠正它

PS.:我使用的是OS X El Capitan

命令的默认输出文件
g++ -c path/to/file.cpp

不是CCD_ 1而是CCD_。这意味着,以后为链接对象文件而调用的g++无法找到这些文件。编辑您的Makefile并将-o $@添加到unionfind/QuickUnion.ounionfind/UnionFind.o规则中。