LINUX.ORG.RU

C++ : undefined reference to namespace function

 ,


0

2

Файл animals.cpp:

#include <iostream>
#include "dog.h"

int main(int argc, char* argv[]) {
    DOG::bark();
    return 0;
}

Файл dog.h:

namespace DOG {
    void bark();
}

Файл dog.cpp:

#include "dog.h"

void DOG::bark() {
    std::cout << "bark" << std::endl;
}

При компиляции выдаёт ошибку:

$ LC_ALL=C g++ animals.cpp
/tmp/ccDBJCRI.o: In function `main':
animals.cpp:(.text+0x2c): undefined reference to `DOG::bark()'
collect2: error: ld returned 1 exit status

Что я не так делаю?

P.S.: Мой основной язык — Java.

Как минимум, не линкуешь код из другой единицы трансляции. Которая ещё по идее и не скомпилируется.

onhydro ()

Не мучай скрипку, почитай книжку или курс какой пройди...

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

не компилируешь dog.cpp

То чувство когда на Java пишешь не простые проекты, а на C++ не компилируешь собаку :)

Спасибо. Исправил.

Плюс в dog.cpp нужно добавить

#include <iostream>

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

Да да. То то когда народ не понимающий как такие вызовы работают, приходя на проект чуть больше хелловорлда по паре недель тупит как бы это собрать, если его песочницей не наградили.

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

Это путь от джуна к синьору. Что станется с бедным синьором, если вместо закастмизированного симейка он внедрит ну там мейк или шелскрипт я не знаю?

anonymous ()

главное в данной ситуации игнорировать RazrFalcon и думать своей головой

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

приходя на проект чуть больше хелловорлда по паре недель тупит как бы это собрать

Что у вас там за жесть вместо сборки?

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

Да да. То то когда народ не понимающий как такие вызовы работают, приходя на проект чуть больше хелловорлда по паре недель тупит как бы это собрать, если его песочницей не наградили.

флакон до сих пор безработный чудак с манией величия, не стоит обращать на него внимание

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

В основном, просто много опенсурсных зависимостей особым образом конфигурируемых. Не ракетная наука, лично я за пару часов разобрался. Для того, что бы приблизительно заценить - собери тот же mir, до состояния «запустил в целевом окружении и оно не упало».

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

когда на Java

Java за тебя решает, где что будет лежать, поэтому компилятор может быстро всё найти. В C++ таких требований нет, поэтому все единицы трансляции нужно компилировать явно. И ещё потом компоновать вместе, чтобы получить результат.

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

C++ таких требований нет

Но все и давно хотят, что бы были :)

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

Ну, основной проект уже давно и почти везде CMake, кроме лютого легаси. А вот зависимости это всегда пляски, т.к. обычно это нечто стабильное...

Какой нибудь spidermonkey под винду собрать в варианте статическая либа статический рантайм, тот ещё квест для того, кто не знает про единицы трансляции и как устроенны статические библиотеки под целевой платформой :)

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

Какие-то примеры будут? Я-то себе делал маленькую систему сборки из шеллскриптов и модифицировал экзотичные чужие. :)

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

Умение вызывать gcc вручную - малополезное умение.

Сильно зависит от того, в какой области ты работаешь. Для прикладного программиста под две попсовые платформы - может, и малополезное.

tailgunner ★★★★★ ()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Поинт в том, что знание GCC ничего не даст, если ты не знаешь ещё парочку компиляторов и все их базовые опции. Что приводит нас к использованию системы сборки, пусть даже такой примитивной, как make.

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

Поинт в том, что знание GCC ничего не даст, если ты не знаешь ещё парочку компиляторов и все их базовые опции

Очень даже даст.

Что приводит нас к использованию системы сборки, пусть даже такой примитивной, как make.

Речь не об полезности систем сборок, а о том, что умение вызывать gcc вручную очень полезно (не всем, конечно), даже если ты никогда не делаешь этого вручную.

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

Приведите хоть один пример, когда нужно руками собирать.

Когда нет билдсистемы. Или она есть, но дерьмо. Я вот знаю два хороших проекта на C/C++ у которых вместо билдсистемы Gradle с плагином.

Руками собирать ещё можно небольшие куски кода, которые хочется проверить отдельно от проекта. Красноглазить для этого CMakeLists... нет, долго и нудно, а надо здесь и сейчас.

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

Хм, ну если он ещё умудряется жить, и не на мамкиных борщах, то, возможно, стоит у него поучиться?

откуда инфа что он не на мамкиной шее и не работник общепита?

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

Когда нет билдсистемы.

И как тут поможет знание gcc? Всё равно нужно будет в свою систему добавлять.

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

Если нет внешних зависимостей - возможно. Но тогда проще онлайн.

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

онлайн

Я же сказал. Нужно здесь и сейчас. Онлайн это долго всегда.

И как тут поможет знание gcc?

Ты в любом случае представляешь как вызывается компилятор, даже если не делаешь это руками. Ну по крайней мере я так делаю: представляю как нужно вызвать GCC, а уже из этого конфигурирую билдсистему.

Более того, есть в этом мире не только gcc-linux, есть другие компиляторы и платформы. Где-то флаг есть, где-то он называется иначе, где-то его нет. Даже такой монстр как CMake неспособен покрыть разницу во флагах между gcc и msvc.

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

Полезно, но не обязательно.

Кому полезно - тому обязательно. Но полезно не всем, да.

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

Онлайн это долго всегда.

Только не тогда, когда компилятора тупо нет.

Где-то флаг есть, где-то он называется иначе, где-то его нет.

О чём и речь. Это проблемы системы сборки.

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

Это проблемы системы сборки.

Которые решать приходится их пользователям.

Только не тогда, когда компилятора тупо нет.

Сапожник без сапог?

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