none
Ошибка LNK2001 компоновщика при компиляции консольного приложения Visual C++ в MS VS 2013.. RRS feed

  • Вопрос

  • Доброе утро. Объявил в секции private класса статическую переменную wordsInFilesTotally типа unsigned int следующим образом:

    class WordCount
    	{
    	public:
                    // Запускает подсчёт количества слов в текстовых файлах в параллельном режиме с использованием пула потоков.
    		static VOID CountWordsInTextFiles_with_ThreadPool(struct WordCountContext* p_WordCountContext);                
    	private:
    		// Подсчитывает количество слов в текстовых файлах в параллельном режиме с использованием пула потоков.
    		static VOID CALLBACK CountWordsInFiles(PTP_CALLBACK_INSTANCE p_Instance, PVOID p_WordCountContext, PTP_WORK p_Work);
    		// Счётчик для подсчёта всех слов в файлах, применяемый в функции CountWordsInTextFiles_with_ThreadPool.
    		static unsigned wordsInFilesTotally;
    	};

    Присваиваю этой переменной значение ноль в начале выполнения функции CountWordsInTextFiles_with_ThreadPool():

    VOID WordCount::CountWordsInTextFiles_with_ThreadPool(struct WordCountContext* p_WordCountContext)
    {
    	wordsInFilesTotally = 0;
    
    	TP_CALLBACK_ENVIRON CallBackEnviron;
    	PTP_POOL pool = NULL;
    
            . . . . . . .
    
            pool = CreateThreadpool(NULL);
    
            . . . . . . .
    }

    А в функции CountWordsInFiles() выполняю инкремент этой переменной:

    VOID CALLBACK WordCount::CountWordsInFiles(PTP_CALLBACK_INSTANCE p_Instance, PVOID p_WordCountContext, PTP_WORK p_Work)
    {
    	EnterCriticalSection(&CriticalSection);
    
    	UNREFERENCED_PARAMETER(p_Instance);
    	UNREFERENCED_PARAMETER(p_Work);
    
    	. . . . . . . . . . . .
    	
    	// Для каждого файла, имя которого получено из вектора, выполнить следующее:
    	for (; fileNames_Iter != textFilesNames.end(); fileNames_Iter++)
    	{
    		// Создать поток для чтения из файла.
    		ifstream fileStream(*fileNames_Iter);
    		// Проверить, открылся ли файл.
    		if (fileStream.is_open())
    		{
    			wordsInFile = 0;
    
    			// Выполнять чтение.
    			while (fileStream.good())
    			{
    				. . . . . . . . . .
    				// ПОДСЧИТАТЬ ОБЩЕЕ КОЛИЧЕСТВО СЛОВ ВО ВСЕХ ФАЙЛАХ.
    				wordsInFilesTotally++;
    			}
    
    			. . . . . . . .
    		}
    	}
    	LeaveCriticalSection(&CriticalSection);
    
    	return;
    }

    При построении проекта выдается следующая ошибка:

    error LNK2001: неразрешенный внешний символ ""private: static unsigned int WordCountFunc::WordCount::wordsInFilesTotally" (?wordsInFilesTotally@WordCount@WordCountFunc@@0IA)"
    Класс WordCount входит в состав статической библиотеки классов, но по-моему это, в данном случае, не имеет значения. В чём же причина этой ошибки? Скажите, пожалуйста. Ведь wordsInFilesTotally всего лишь статическая беззнаковая целочисленная переменная, член того же самого класса, что и использующие её функции (которые сами тоже static!). Так из-за чего возникает эта ошибка?



    • Изменено Purple_Apple 17 декабря 2014 г. 7:58
    17 декабря 2014 г. 7:52

Ответы

  • Статические поля класса нужно кроме объявления еще и определять в глобальной области. В этом случае под такое поле будет выделена память. Напишите в каком-либо cpp-файле (там, где виден класс):

    unsigned WordCount::wordsInFilesTotally;


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа Purple_Apple 17 декабря 2014 г. 8:50
    17 декабря 2014 г. 8:42