clang错误链接器命令失败

时间:2015-11-16 16:04:56

标签: c++ xcode clang linker-errors

在SO上有很多这样的帖子,但大多数都与xcode有关,我无法复制他们的解决方案。我有一个Heap.h,Heap.cpp和main.cpp,每当我尝试用g++ main.cpp Heap.cpp运行main.cpp时,它就会给我:

clang: error: linker command failed with exit code 1 (use -v to see invocation)

Heap.h

#ifndef _HEAP_H_
#define _HEAP_H_

template<class T>
class Heap{
    private:
        struct Node{
            T *dist;
            T *v;

            bool operator==(const Node& a){
                return *dist == *(a -> dist);
            }

            bool operator!=(const Node& a){
                return (!(*dist == *(a -> dist)));
            }

        };

        Node *container;
        int size;
        int curSize;
        T sourceV;        

    public:
        Heap();
        Heap(int inSize, T inSourceV);

};

    #endif

Heap.cpp

#include <iostream>
#include <vector>
#include <limits>
#include "Heap.h"

using namespace std;

template<class T>
Heap<T>::Heap(){
    cout << "hello" <<endl;
}

template<class T>
Heap<T>::Heap(int inSize, T inSourceV){
    size = inSize;
    container = new Node[size];
    curSize = 0;
    sourceV = inSourceV;

    int maxVal = numeric_limits<int>::max();
    for (int i = 1; i < size; i++){
        container[i].dist = &maxVal;
        container[i].v = &maxVal;
    }
}

的main.cpp

#include "Heap.h"
#include <iostream>

using namespace std;

int main(){
   Heap <int> h; 
}

奇怪的是,我有另一个包含bst.h bst.cpp main.cpp的项目,那些运行正常。这两个项目之间的区别在于我实现的bst不是模板化的类。

我还看到另一篇类似的帖子提到了有关更改bitcode设置的内容,但我不知道从哪里访问它。有什么想法吗?

我正在运行xcode 7.1。 Apple LLVM 7.0.0版(clang-700.1.76) 目标:x86_64-apple-darwin14.5.0 线程模型:posix

1 个答案:

答案 0 :(得分:2)

您没有在Heap<int>编译中实例化Heap.cpp。因此,编译器不会为Heap.o生成任何代码。

如果你这样做,你可以看到:

nm Heap.o

它告诉你那里什么都没有。

这是C ++编译器的典型行为 - 除非有实例化,否则不会将模板转换为代码。

快速解决方案

  1. 将所有Heap.cpp代码移动到Heap.h
  2. 的模板类声明中
  3. Heap.cpp中创建一个虚拟函数,用于实例化Heap<int>