Задать вопрос
drem1lin
@drem1lin
чуть программист, чуть чуть админ...

Как исправить ошибку линкера?

Привет всем, не могу понять что хочет от меня линкер.
Если кратко, есть класс который описывается
так
class ModuleClass
{
public:
	ModuleClass(const char* ModuleGUID);
	ModuleClass(std::string ModuleGUID);

	std::string GetModuleGUID();
	int ProcessTast(TaskClass t);

	~ModuleClass();
private:

	int Start(TaskClass t);
	int Stop();
	int Extract();
	int SetExec();
	int Launch();

	int AnswersProcessor();
	int ReadingThreadChecker();

	std::string ModuleGUID;
	std::atomic<bool> isStarted;
	std::atomic<bool> stopFlag;
	PipeServerClass* pipe;
	MessageCollectorClass* msgCollector;
	std::thread * AnswerProcessingThread;
	std::thread * ReaderCheckingThread;
};

Если коротко, то есть модули, и этот класс должен представлять собой некий общий интерфейс к разным модулям.
В нем есть два потока - один проверяет состояние потока чтения PipeClass(он может загнуться, но модуль как бы будет активным), а второй обрабатывает ответы модуля.

Так вот, для всего этого написаны обертки необходимые, но при сборке получаю какую то непонятную мне ругань
./obj/local/arm64-v8a/objs-debug/Kernel/main.o: In function `void std::_Destroy<ModuleClass>(ModuleClass*)':
/home/drem1lin/Android/Sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/include/bits/stl_construct.h:93: undefined reference to `ModuleClass::~ModuleClass()'
./obj/local/arm64-v8a/objs-debug/Kernel/main.o: In function `void std::_Destroy<TaskClass>(TaskClass*)':
/home/drem1lin/Android/Sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/include/bits/stl_construct.h:93: undefined reference to `TaskClass::~TaskClass()'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)

Объясните пожалуйста, что он хочет?
И вообще, я несколько не понимаю, если есть вот такой конструктор
ModuleClass::ModuleClass(std::string ModuleGUID)
{
	this->ModuleGUID.clear();
	this->ModuleGUID.append(ModuleGUID);
	msgCollector = new MessageCollectorClass();
	std::string myfifo("//data//local//tmp//\0");
	myfifo.append(this->ModuleGUID);
	pipe = new PipeServerClass(myfifo, std::bind(std::mem_fn(&MessageCollectorClass::AddData), msgCollector, std::placeholders::_1, std::placeholders::_2));;
	isStarted = false;
	stopFlag = false;
	ReaderCheckingThread = nullptr;
	AnswerProcessingThread = nullptr;
}

Какой должен быть деструктор?
  • Вопрос задан
  • 409 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Ariox41
Компоновщик не видит деструктора, потому что он не реализован.
Просто оберните все указатели в std::unique_ptr, деструкттор сгенерируется автоматически, да и других проблем поубавится.
class ModuleClass
{
public:
  ModuleClass(const char* ModuleGUID);
  ModuleClass(std::string ModuleGUID);

  std::string GetModuleGUID();
  int ProcessTast(TaskClass t);

  ~ModuleClass() = default; // генерируется автоматически благодаря умным указателям
private:

  int Start(TaskClass t);
  int Stop();
  int Extract();
  int SetExec();
  int Launch();

  int AnswersProcessor();
  int ReadingThreadChecker();

  std::string ModuleGUID;
  std::atomic<bool> isStarted;
  std::atomic<bool> stopFlag;
  std::unique_ptr<PipeServerClass> pipe;
  std::unique_ptr<MessageCollectorClass> msgCollector;
  std::unique_ptr<std::thread> AnswerProcessingThread;
  std::unique_ptr<std::thread> ReaderCheckingThread;
};


UPD:
Хотя с потоками могут возникнуть проблемы, нужно либо дождаться их завершения, либо вызвать detach. В любом случае, нужно либо использовать пользовательский deleter для unique_ptr, либо реализовать специальную обертку над потоком.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы