Ошибка в компиляции кода C ++? - PullRequest
0 голосов
/ 02 марта 2010

Это мой test.cpp:

#include <iostream.h>
class C {
public:
C();
~C();
};

int main()
{
C obj;
return 0;
}

Когда я компилирую его с помощью команды g++ test.cpp, я получаю это сообщение об ошибке:

    In file included from /usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/backward/iostream.h:31,
                     from test.cpp:1:
    /usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the  header for the  header for C++ includes, or  instead of the deprecated header . To disable this warning use -Wno-deprecated.
    /cygdrive/c/Users/aswinik_sattaluri/AppData/Local/Temp/ccoYkiAS.o:test.cpp:(.text+0x131): undefined reference to `C::C()'
    /cygdrive/c/Users/aswinik_sattaluri/AppData/Local/Temp/ccoYkiAS.o:test.cpp:(.text+0x13c): undefined reference to `C::~C()'
    collect2: ld returned 1 exit status

Компиляция с gcc test.cpp дает похожие сообщения и даже больше:

    In file included from /usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/backward/iostream.h:31,
                     from test.cpp:1:
    /usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the  header for the  header for C++ includes, or  instead of the deprecated header . To disable this warning use -Wno-deprecated.
    /cygdrive/c/Users/aswinik_sattaluri/AppData/Local/Temp/cc3ntGx0.o:test.cpp:(.text+0xd): undefined reference to `std::basic_string, std::allocator >::size() const'
    /cygdrive/c/Users/aswinik_sattaluri/AppData/Local/Temp/cc3ntGx0.o:test.cpp:(.text+0x60): undefined reference to `std::basic_string, std::allocator >::operator[](unsigned int) const'
    /cygdrive/c/Users/aswinik_sattaluri/AppData/Local/Temp/cc3ntGx0.o:test.cpp:(.text+0x9f): undefined reference to `std::basic_string, std::allocator >::operator[](unsigned int) const'
    /cygdrive/c/Users/aswinik_sattaluri/AppData/Local/Temp/cc3ntGx0.o:test.cpp:(.text+0xce): undefined reference to `std::basic_string, std::allocator >::operator[](unsigned int) const'
    /cygdrive/c/Users/aswinik_sattaluri/AppData/Local/Temp/cc3ntGx0.o:test.cpp:(.text+0x131): undefined reference to `C::C()'
    /cygdrive/c/Users/aswinik_sattaluri/AppData/Local/Temp/cc3ntGx0.o:test.cpp:(.text+0x13c): undefined reference to `C::~C()'
    /cygdrive/c/Users/aswinik_sattaluri/AppData/Local/Temp/cc3ntGx0.o:test.cpp:(.text+0x165): undefined reference to `std::ios_base::Init::Init()'
    /cygdrive/c/Users/aswinik_sattaluri/AppData/Local/Temp/cc3ntGx0.o:test.cpp:(.text+0x180): undefined reference to `std::ios_base::Init::~Init()'
    collect2: ld returned 1 exit status

Обратите внимание, что я не установил LD_LIBRARY_PATH:

    bash-3.2$ echo $LD_LIBRARY_PATH

    bash-3.2$ 

Ответы [ 7 ]

10 голосов
/ 02 марта 2010

Вы объявили существование конструктора и деструктора C, но не предоставили реализации. Попробуйте:

class C {
public:
    C() {}
    ~C() {}
};

И для программ на C ++ используйте g++ для компиляции (как в первой попытке).

9 голосов
/ 02 марта 2010

Заменить

#include <iostream.h>

от

#include <iostream>

и предоставляют реализации, по крайней мере, пустые, конструктора и деструктора класса C.

5 голосов
/ 02 марта 2010

Поскольку вы не предоставите актуальный вопрос, мне придется угадать, что вы хотели бы знать.В любом случае, мои 2c:

  • Не используйте iostream.h, этот заголовок является стандартным и сильно устарел.Используйте <iostream> вместо
  • Вы не предоставляете никакой реализации для конструктора и деструктора C, на что жалуется компоновщик.
4 голосов
/ 02 марта 2010

Вы включаете iostream.h вместо iostream, поэтому вы получаете предупреждение об этом включении. Также вы объявили конструктор и деструктор для C, но на самом деле вы его нигде не реализовали. Поэтому компоновщик жалуется на неопределенные символы.

Вам необходимо добавить реализации для методов C, например:

C::C() {
  // ...
}
4 голосов
/ 02 марта 2010

Вам нужно определить ваш конструктор C и деструктор:

C::C()
{
}

C::~C()
{
}

Кроме того, продолжайте компиляцию с помощью g ++.Если вы внимательно посмотрите, ошибки, которые вы получаете при компиляции с gcc, включают все, что вы получаете с g ++, плюс дополнительные ошибки.

0 голосов
/ 02 марта 2010

Одно замечание о LD_LIBRARY_PATH - это не касается вас во время компиляции или компоновки (тогда компоновщик будет искать пути, заданные с -L, и некоторые стандартные пути, такие как / usr / lib).

Это важно Когда вы запускаете свое приложение - система сначала будет искать общие библиотеки по путям, указанным в LD_LIBRARY_PATH.

http://www.linux.org/docs/ldp/howto/Program-Library-HOWTO/shared-libraries.html

0 голосов
/ 02 марта 2010

используйте #include <iostream> вместо #include <iostream.h>

Вы должны правильно прочитать ошибку.

...