GCC не разрешается автоматически .cpp из класса .h include

0

Моя проблема аналогична этой, но я не могу понять, как ее исправить в eclipse.

У меня есть странное поведение при компиляции небольшой программы на eclipse. Когда я включаю файл.cpp в конец заголовка (и удаляю include.h в.cpp), он компилируется, а в противном случае - нет.

Класс, который я пытаюсь включить, находится в отдельном проекте и этот проект правильно связан.

Вот пример:

В источниках проекта

файл myclass.h

#ifndef MYCLASS_H_
#define MYCLASS_H_

namespace lol
{
class myclass{ public // definitions... }
}
//#include myclass.cpp //**works when I uncomment this**
#endif

файл myclass.cpp

#include "myclass.h" // ** does not work unless I include my .cpp (unity build like) **
                     // and I don't want to include .cpp files
namespace lol{ // not funny

myclass::myclass(){
} //code ... code
}

В другом проекте mainFile.cpp

#include "myclass.h" // works only if I include myclass.cpp at the end of myclass.h

using namespace lol;
int main(){
    myclass obj = myclass(); // gives undefined reference to lol::myclass::myclass()
}

Я мог бы исправить это, построив все из make файла, который является решением, которое мне нравится, но мне нужно использовать eclipse, к сожалению.

Какие-либо предложения?

Благодарю!

Теги:
gcc
eclipse-cdt

2 ответа

1

Вам не хватает "#endif" в конце файла include.

Вместо этого используйте "# прагма один раз".

// .h file
#pragma once

namespace lol
{
    class foo {};
}

// end of file

Смотрите мое объяснение компиляционной единицы и конвейера здесь.

  • 0
    Извините, я забыл написать endif в моем вопросе, он присутствует в моем коде. Спасибо, что ответили на вопрос, хотя.
  • 0
    Вам нужно будет обновить пост, чтобы включить фактическую ошибку компиляции / ссылки, которую вы получаете тогда
0

Я бы сказал, что если ваш .cpp видно из генерации Auto Makefile eclipse, он берет его как источник (блок перевода) и добавляет его в список источников.

Если вы хотите включить встроенные определения (один раз), вы должны использовать разные расширения файлов (например .tcc, .icc).

Вы также можете попытаться исключить его из конфигураций ресурсов проекта (щелкните правой кнопкой .cpp, выберите "Конфигурации ресурсов → Исключить из сборки").

Другой вариант - изменить тип проекта на "Makefile project" и самостоятельно сохранить make файлы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню