C++ - error LNK2001 lub LNK2019

Dodano: 2010-09-18

Pisząc programy w języku C++ używając środowiska VS możemy się spotkać z komunikatem, który w przybliżeniu wygląda tak: error LNK2001: unresolved external symbol "public: [returned type] [class name]::[method name]([arguments])" (?[method name]@[class name]@@SA_NPBD@Z) referenced in function _main

Komunikat ten zobaczymy po próbie kompilacji w trybie Release, a w przypadku Debug będzie zmiana typu błędu na error LNK2019.

Poszukując rozwiązania tego problemu w Internecie zobaczymy kilka sposobów rozwiązania go, nie zawsze jest to tak skomplikowane jakby się mogło wydawać.

Dokładny opis typu błędu zawracanego przez środowisko Visual C++ można znaleźć na stronie Error LNK2001 - C++ oraz Error LNK2019 - C++

Często komunikat ten wynika z prostego błędu programistycznego jakim jest zdefiniowanie metody klasy, która nie jest dodana do przestrzeni nazw tejże klasy. Najłatwiej popełnić ten błąd pisząc klasy przy użyciu dwóch plików nagłówkowego i źródłowego.

cClass.h
#pragma once

#include <iostream>

class cClass{
public:
	cClass(void);
	~cClass(void);

	void printHello();
	// metoda która nie zostanie dodana do przestrzeni nazw
	void printSomthing();
};
cClass.cpp
#include "cClass.h"


cClass::cClass(void)
{
}


cClass::~cClass(void)
{
}

void cClass::printHello(){
	std::cout << "Hello" << std::endl;
}
	
void printSomthing(){
	std::cout << "Użyjesz tej \"metody\" lecz program się wysypie." << std::endl;
}

Powyższy zapis jest poprawny i w czasie kompilowania projektu nie zostanie wyświetlony komunikat o błędzie. Problem tkwi w zapisie metody którą zdefiniowaliśmy void printSomthing(); w pliku nagłówkowym. W pliku źródłowym nie została zawarta ona w przestrzeni nazw klasy cClass co spowoduje przerwanie działania programu po jej użyciu w kodzie programu np.:

main.cpp
#include <conio.h>

#include "cClass.h"

int _tmain(int argc, _TCHAR* argv[])
{

	cClass cl;
	cl.printHello();
	// wywołanie poniższej funkcji zatrzyma kompilacji programu
	cl.printSomthing();

	_getch();
	return 0;
}

Pojawi się błąd tryb Debug: error LNK2019: unresolved external symbol "public: void __thiscall cClass::printSomthing(void)" (?printSomthing@cClass@@QAEXXZ) referenced in function _wmain

Metoda w pliku źródłowym stała się lokalną funkcją, która może zostać użyta lecz tylko w obrębie klasy cClass.