对类ERROR的未定义引用

时间:2011-07-18 10:50:27

标签: c++ qt ubuntu

我在c ++ / ubuntu工作。 我有:

libr.hpp

#ifndef LIBR
#define LIBR


#include <string>
using namespace std;

class name
{
    public:
    name();
    ~name();
    std::string my_name;
    std::string method (std::string s);

};


#endif

libr.cpp

#include <iostream>
#include <string>
#include <stdlib.h>
#include "libr.hpp"
using namespace std;


name::name()
{

}
std::string name::method(std::string s)
{
    return ("YOUR NAME IS: "+s);
}

从这两个我创建了一个libr.a

在test.cpp中:

#include <iostream>
#include <string>
#include <stdlib.h>
#include "libr.hpp"

using namespace std;

int main()
{

    name *n = new name();
    n->my_name="jack";
    cout<<n->method(n->my_name)<<endl;
    return 0;
}

我用g ++和libr.a编译。我有一个错误:“name :: name()undefined reference”,为什么?

我想提一下,我已经在.a的qmake中添加了qt创建者。当我编译时,我有错误。我该如何解决?

3 个答案:

答案 0 :(得分:1)

这是链接器错误,而不是编译器错误。这意味着您已经调用但尚未定义构造函数。您的分配name *n = new name();会调用构造函数。

由于你在libr.cpp中定义了构造函数,这意味着这个编译单元没有进入你的可执行文件。您提到您正在使用libr.a进行编译。编译libr.cpp时,结果是.o文件,而不是.a文件。

您没有将libr.o链接到您的可执行文件中。

答案 1 :(得分:0)

您用于编译“项目”的步骤是什么?

我执行了以下步骤并设法使用警告/错误构建它。

g++ -Wall -c libr.cpp

ar -cvq libr.a libr.o

g++ -Wall -o libr main.cpp libr.a

最后一件事,如果我改变了最后一个命令的顺序,比如

g++ -Wall -o libr libr.a main.cpp

我收到以下错误:

Undefined                       first referenced
 symbol                             in file
name::name()                        /tmp/cc4Ro1ZM.o
name::method(std::basic_string<char, std::char_traits<char>, std::allocator<char
> >)/tmp/cc4Ro1ZM.o
ld: fatal: Symbol referencing errors. No output written to libr
collect2: ld returned 1 exit status

答案 2 :(得分:0)

实际上,您不需要自己定义析构函数,因为在类调用结束时将使用默认析构函数。 在VS2008中,没关系!