架构x86_64的未定义符号:El Capitan

时间:2016-01-09 16:35:24

标签: c++ c macos gcc

我正在使用Mac OSX 10.11 El Capitan

以前我使用的是OSX 10.10。我的旧版OSX我正在运行gcc 4.9g++ 4.9。但升级到OSX 10.11后,所有C ++程序都开始无法编译。

然后我切换回gcc 4.2中的OSX 10.11,我收到了以下错误:

Undefined symbols for architecture x86_64:
  "Graph::BFS(int)", referenced from:
      _main in BFS-e06012.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我尝试了所有可用的答案。我试过这些命令来运行:

$ g++ -stdlib=libstdc++ BFS.cc -o BFS
$ g++ -lstdc++ BFS.cc -o BFS
$ gcc -lstdc++ BFS.cc -o BFS
$ g++ BFS.cc

但是没有什么对我有用。

当我在shell上发射gcc --version时。我明白了:

gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/c++/4.2.1
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin15.2.0
Thread model: posix

我尝试运行的程序是BFS.cc,其中包括以下内容:

/*
* Algo: BFS
*/
#include <iostream>
#include <list>

using namespace std;

class Graph {
    int V;
    list<int> *adj;

    public:
        Graph(int V);
        void addEdge( int v, int w);
        void BFS(int s);
};

Graph::Graph(int V) {
    this->V = V;
    adj = new list<int> [V];
}

void Graph::addEdge(int v, int w) {
    adj[v].push_back(w);
}

int main(int argc, char const *argv[]) {
    Graph g(4);
    g.addEdge(0, 1);
    g.addEdge(0, 2);
    g.addEdge(1, 2);
    g.addEdge(2, 0);
    g.addEdge(2, 3);
    g.addEdge(3, 3);

    cout << "Following is Breadth First Traversal (starting from vertex 2) \n";
    g.BFS(2);
    return 0;
}

有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

在您的代码中,您缺少Graph::BFS(int)实现,但它在类定义中定义:

void BFS(int s);

如果您不使用此方法(优化程序将删除它),这甚至可以工作,但是,您在代码中使用它并且此方法没有实现。

因此,这不是操作系统/编译器故障,而只是您自己的故障。甚至更多 - 此代码之前甚至无法链接,因此您可能会对其进行更改。