неопределенная ссылка на класс ERROR - PullRequest
0 голосов
/ 18 июля 2011

Я работаю в 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", почему?

Я хотел бы отметить, что я добавил в qt creator на qmake .a. Когда я компилирую, у меня есть ошибка. Как я могу решить это?

Ответы [ 3 ]

1 голос
/ 18 июля 2011

Это ошибка компоновщика, а не ошибка компилятора. Это означает, что вы вызвали, но не определили конструктор. Ваше распределение name *n = new name(); вызывает конструктор.

Поскольку вы определили конструктор в своем libr.cpp, это означает, что этот модуль компиляции не попадает в ваш исполняемый файл. Вы упомянули, что вы компилируете с libr.a. Когда вы компилируете свой libr.cpp, результатом будет файл .o, а не файл .a.

Вы не связываете libr.o со своим исполняемым файлом.

0 голосов
/ 18 июля 2011

фактически , вам не нужно определять деструктор самостоятельно, потому что деструктор по умолчанию будет использоваться, когда вызов класса закончен.и в VS2008 all все в порядке!

0 голосов
/ 18 июля 2011

Какие шаги вы используете для компиляции вашего "проекта"?

Я выполнил следующие шаги и сумел построить его с предупреждениями / ошибками.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...