LINUX.ORG.RU

[C++]ошибка компиляции


0

2
#include <iostream>

using namespace std;

int main()
{
        cout << "HELLO WORLD";

        return 0;
}

Компилировал в консоли, компилятор выдает ошибку:

/tmp/ccEIUq2g.o: In function `main':
main.cpp:(.text+0x14): undefined reference to `std::cout'
main.cpp:(.text+0x19): undefined reference to 
`std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/tmp/ccEIUq2g.o: In function `__static_initialization_and_destruction_0(int, int)':
main.cpp:(.text+0x41): undefined reference to `std::ios_base::Init::Init()'
main.cpp:(.text+0x46): undefined reference to `std::ios_base::Init::~Init()'
/tmp/ccEIUq2g.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status

Что-то мне подсказывает, что у меня что-то не стоит..я новичок, подскажите!

ЕМНИП libc++, или как-то так.

Zhbert ★★★★★ ()

/tmp :$cat test.cpp
#include <iostream>

using namespace std;

int main()
{
cout << «HELLO WORLD»;

return 0;
}

/tmp :$g++ test.cpp -o test
/tmp :$./test
HELLO WORLD/tmp :$



как-то неправильно компилировали значит

наверное gcc а не g++

Sylvia ★★★★★ ()
Ответ на: комментарий от Sylvia

>наверное gcc а не g++

Или это да. Попробуй g++ вместо gcc

Zhbert ★★★★★ ()
Ответ на: комментарий от BlacKeeper

на будущее, не забывайте что включаемые вами заголовки обычно могут потребовать ключиков -llib

например

#include <cmath>

потребует -lm

Sylvia ★★★★★ ()
Ответ на: комментарий от Sylvia

Зачем нужны эти ключики и куда их конкретно нужно вставлять?

BlacKeeper ()
Ответ на: комментарий от BlacKeeper

Думаю, имеются ввиду ключи для g++, наподобие -o, который ты писал.

Zhbert ★★★★★ ()
Ответ на: комментарий от BlacKeeper

Чтобы собрать программу с библиотекой libm.a (куда входит <cmath>) нужна следующай команда:

g++ test.cpp -lm -o test

Zodd ★★★★★ ()
Ответ на: комментарий от Yareg

зачем? она и так мелкая, зато монолитное может работать быстрее будет

namezys ★★★★ ()
Ответ на: комментарий от namezys

ну по умолчанию-то в дистрах всё в динамике собрано. не пересобирать же

Yareg ★★★ ()
Ответ на: комментарий от namezys

работать быстрее не будет, но будет чуть быстрее загружаться, за счет того что ld-linux.so.2 не будет ее загружать

лучше оставлять динамические, если нет необходимости и веской причины делать статику, и уж тем более для хелло-ворльдов

Sylvia ★★★★★ ()
Ответ на: комментарий от Sylvia

Это как раз исключение, она собрана статически

А вызов из дин. библиотек не накладывает дополниетльные разходы?

namezys ★★★★ ()
Ответ на: комментарий от namezys

>А вызов из дин. библиотек не накладывает дополниетльные разходы?

Нет. Библиотека отражается в адресное пространство процесса, вызов происходит примерно так же, как и в случае статической линковки.
Те, если при статической линковке мы имеем:
my_func equ 4006666
call my_func
то при динамической мы имеем адрес ф-и в переменной:
mov [my_func_offset], 4006666
call [my_func_offset].

anon_666 ()
Ответ на: комментарий от namezys

Проц адресацию считает в любом случае с одной скоростью + не забываем про кеш.
Кроме того, оверхед на вызов функций на x86 вообще мизерный, на форуме кто-то замерял в прошлом году.

anon_666 ()
Ответ на: комментарий от anon_666

> Кроме того, оверхед на вызов функций на x86 вообще мизерный, на форуме кто-то замерял в прошлом году.

видимо, неправильно замерял

с динамическими библиотеками есть ещё одна особенность: pic не всегда полезен

anonymous ()
Ответ на: комментарий от anon_666

>Кроме того, оверхед на вызов функций на x86 вообще мизерный

Херня.

Вот. Без FULL_CALL, т.е. без enter и leave, у меня в 4 раза большее время. С ним - до 6 раз.

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#define FULL_CALL

void test_call(unsigned int n);
void test_nocall(unsigned int n);
void foo(unsigned int m);

int main(int argc, char *argv[])
{
    unsigned int n;
    clock_t clocks;
    if(argc != 2)
    {
        fprintf(stderr, "Usage: call N\n");
        return 1;
    }
    if(!(n = strtoul(argv[1], NULL, 10)))
    {
        fprintf(stderr, "Invalid value: %s\n", argv[1]);
        return 1;
    }
    clocks = clock();
    test_call(n);
    printf("call: %g ms\n", (clock()-clocks)*1000.0/CLOCKS_PER_SEC);

    clocks = clock();
    test_nocall(n);
    printf("no call: %g ms\n", (clock()-clocks)*1000.0/CLOCKS_PER_SEC);
    return 0;
}

asm(
"\n\
_test: \n"
#ifdef FULL_CALL
"\n\
    push %ebp \n\
    mov %esp, %ebp \n\
    leave \n\
\n"
#endif
"\n\
    ret \n\
\n\
_test_call: \n\
    push %ebp \n\
    mov %esp, %ebp \n\
    pusha \n\
    movl 8(%ebp), %ecx \n\
_call_loop: \n\
    call _test \n\
    loop _call_loop \n\
    popa \n\
    leave \n\
    ret \n\
\n\
_test_nocall: \n\
    push %ebp \n\
    mov %esp, %ebp \n\
    pusha \n\
    movl 8(%ebp), %ecx \n\
_nocall_loop: \n\
    loop _nocall_loop \n\
    popa \n\
    leave \n\
    ret \n\
");

Love5an ()
Ответ на: комментарий от Love5an

если добавить сюда выкрутасы со стеком - передачу параметров, и сохранение/восстановление определенных регистров, получим еще больший оверхед.

Love5an ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.