Моя проблема аналогична этой, но я не могу понять, как ее исправить в 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, к сожалению.
Какие-либо предложения?
Благодарю!
Вам не хватает "#endif" в конце файла include.
Вместо этого используйте "# прагма один раз".
// .h file
#pragma once
namespace lol
{
class foo {};
}
// end of file
Смотрите мое объяснение компиляционной единицы и конвейера здесь.
Я бы сказал, что если ваш .cpp
видно из генерации Auto Makefile eclipse, он берет его как источник (блок перевода) и добавляет его в список источников.
Если вы хотите включить встроенные определения (один раз), вы должны использовать разные расширения файлов (например .tcc
, .icc
).
Вы также можете попытаться исключить его из конфигураций ресурсов проекта (щелкните правой кнопкой .cpp
, выберите "Конфигурации ресурсов → Исключить из сборки").
Другой вариант - изменить тип проекта на "Makefile project" и самостоятельно сохранить make файлы.