2011-02-18 101 views
0

我在下面的程序中遇到了一些问题,程序使用链表来实现一个堆栈,我没有在这里显示所有的代码,因为代码很好,但是我遇到的问题是与不同的文件链接在一起。C++链接器错误

我使用IDE以运行该程序。当运行TestIntStacks.cpp,主要方法应该调用test()StackFunctions.cpp,测试功能(在StackFunctions.cpp定义),使用TestStack类的方法 目前,我收到一个错误,说“链接器错误,推/流行未定义”我做错了什么?我敢肯定这是一个名称空间。

MyStack.h 
------------------------------------- 
namespace A 
{ 
    class Node{ 
     public : 
      char data; 
      StackNode* link; 
      StackNode(int v=0): data(v), link(NULL){ } 
    }; 

    class MyStack{ 
     private: 
      Node * top; 

     public: 
      MyStack():top(NULL){ } 
      void push(int c); 
    }; 
}//namespace 


//TestStack.cpp 
-------------------------------------------------------------- 
#include "MyStack.h" 

namespace A 
{ 
    void MyStack::push(int x) 
    { 
     StackNode *temp = new StackNode(x); 
     temp->link = top; 
     top = temp; 
    } 
} 

//StackFunctions.cpp 
----------------------------------------------------------- 
#include <iostream> 
#include "TestStack.h" 

using namespace std; 
using namespace A; 

void test() 
{ 
    MyStack st; 
    st.push(1); 
    st.push(2); 
    st.push(3); 
    st.push(4); 
} 

// TestIntStacks.cpp 
---------------------------------------------------------------- 
// Code for testing the TestStack 
// from the A namespace. 

#include <iostream> 
#include <vector> 
using namespace std; 
#include "TestStack" 
#include "StackFunctions.cpp" 

void test(); 
int main() 
{ 
    test(); 
    system("pause"); 
    return 0; 
} 
+0

不确定它是否与名称空间有关。展示如何构建该程序以及如何在StackFunction.cpp中使用此类可能会帮助人们帮助您。 – MHC 2011-02-18 18:50:54

+0

你有错误,你认为你的代码没问题。不是。向我们提供您的代码,以便我们可以告诉您代码中哪里错了。 – wheaties 2011-02-18 18:51:04

+0

什么是链接器命令?发送链接器运行的内容 – 2011-02-18 18:56:33

回答

1

您在头文件TestStack.h中定义了push()pop()方法,但您在TestStack.cpp中没有为它们提供实现。您需要添加对对象执行推送和弹出操作的代码。

+0

感谢您的回复。我已经在我的TestStack.cpp文件中实现了它们,我只是没有在这里显示我的代码。当它在一个文件中时,程序工作正常,当它没有分成.h和.cpp文件时。我正在使用dev-C++ IDE。 – user623629 2011-02-18 19:03:02

1

这个错误对我来说似乎很清楚。您在头文件中声明了push()pop(),但链接程序找不到这些方法的实现位置。

他们在哪里定义?

0

您需要强制构建脚本使用两个cpp文件。如果您编写了自己的make文件,则需要为每个源构建中间对象,然后在最后链接。

我怀疑DEV-C++不会自动生成目标文件或尝试将所有内容链接在一起。

1

我认为它与提供给链接器的参数有关。例如,以下面的方式使用Visual C++ 6时会发生类似的错误。假设您为一个类创建了.cpp和.h文件。如果你没有在你的项目中包含cpp文件,你会得到类似的错误。因为IDE不会根据提供的头文件确定源文件。我不知道dev-C++ IDE,但解决方案可能类似。问题是你编译(或不)TestStack.cpp和这个编译的输出没有提供给链接器,所以链接器找不到实现。