Итак, у меня есть заголовочный файл со статическими членами:
#ifndef PROFILE_MANAGER_H
#define PROFILE_MANAGER_H
#include <map>
#include <vector>
using namespace std;
using std::vector;
namespace Engine
{
class ProfileManager
{
private:
static map<const char*, vector<float>> profiles;
static map<const char*, vector<float>>::iterator it;
static pair<map<const char*, vector<float>>::iterator, bool> ret;
};
}
#endif
И в моем файле cpp у меня есть определения:
#include "ProfileManager.h"
namespace Engine
{
map<const char*, vector<float>> ProfileManager::profiles;
map<const char*, vector<float>>::iterator ProfileManager::it;
pair<map<const char*, vector<float>>::iterator, bool> ProfileManager::ret;
}
Компоновщик всегда жалуется на то, что статические члены являются неразрешенными внешними (LNK2001), хотя я определил их в файле cpp. Есть идеи, почему?
Подобные ошибки обычно случаются, когда компоновщику не дается файл obj, являющийся результатом компиляции cpp.
Ищите ProfileManager.obj в вашей выходной директории. Если его нет, значит что-то не так. Возможно, файл cpp не скомпилирован, как предложил Лучиан Григоре. Также возможно, что компоновщик не получает файл obj в параметрах. Если вы используете visual studio, убедитесь, что файл cpp является частью проекта. В других средах смотрите команду, с которой вызывается компоновщик.
Если вы используете Visual Studio, вы можете открыть свойства проекта -> Линкер -> Командная строка и добавить / VERBOSE в Дополнительный параметр. Затем откройте окно вывода и перекомпилируйте проект. (Спасибо, Крейг за комментарий).
Еще один сценарий, который мог бы случиться. Вы включили файл заголовка в другой проект и попытались создать его без ссылки на проект, в котором находился ProfileManager.cpp.
Других решений пока нет …