ошибка компоновки С++ неразрешенный внешний символ

Я пишу программу Matrix: у меня есть класс для представления обычной матрицы (RegMatrix) и класс для представления разреженной матрицы (SparseMatrix), то есть: представляют только ненулевые значения.

В начале каждого H-файла я пишу противоположное объявление класса. Например, в SparseMatrix.h я пишу класс RegMatrix (чтобы компилятор распознал мои ссылки на этот класс). В каждый файл cpp я включаю оба файла H.

Моя программа компилируется, но у меня много ошибок компоновки, говорящих "неразрешенный внешний символ..."

Например: неразрешенный внешний символ "public: int__thiscall RegMatrix::getCol(void)const " (?getCol@RegMatrix@@QBEHXZ)" [файл: SparseMatrix.obj]

Я схожу с ума, пытаясь понять, что не так с моим кодом.


person darven    schedule 03.10.2010    source источник
comment
Где вы реализовали RegMatrix::getCol() const ?   -  person CB Bailey    schedule 03.10.2010
comment
Не могли бы вы предоставить команды или метод, который вы использовали для компиляции кода?   -  person JoshD    schedule 03.10.2010
comment
Проверьте, указали ли вы правильные пути для своих библиотек? Ваш код скомпилирован нормально.   -  person DumbCoder    schedule 03.10.2010
comment
1. Я реализовал константу RegMatrix::getCol() внутри файла RegMatrix.cpp. 2. Я скомпилировал с помощью Visual Studio (2010). В Linux я скомпилировал строку: g++ -Wall *.cpp *.h (все необходимые файлы) -o Matrix   -  person darven    schedule 03.10.2010
comment
Ваша ошибка явно из Visual Studio. Вы включаете RegMatrix.cpp и SparseMatrix.cpp в один и тот же проект Visual Studio?   -  person CB Bailey    schedule 03.10.2010


Ответы (2)


По сути, это означает, что что-то в вашей программе использует getCol из класса RegMatrix, но ваша компиляция не включает тело такой подпрограммы.

Что искать:

  • Вы действительно создали реализацию этой процедуры? С точно таким же профилем параметров?
  • Вы забыли добавить исходный файл, который компилирует эту подпрограмму, в список исходных файлов, которые нужно скомпилировать и связать с вашей программой? (В VisualStudio вы добавили его в проект?)
  • Возможно, вы случайно не убрали RegMatrix:: в начале имени подпрограммы, когда кодировали ее в файле .cpp?
person T.E.D.    schedule 03.10.2010

Это не имеет ничего общего с взаимными включениями заголовочных файлов, хотя это не очень приятный дизайн. Вы забыли или опечатались в определении (забыли какой-то квалификатор const или что-то в этом роде). Относительно этого утверждения «не очень хороший дизайн»: вы, по-видимому, чередуете два класса, так что их нельзя использовать независимо. Как написать модульный тест для RegMatrix без чередования с SparseMatrix или наоборот? Я предлагаю сделать два определения полностью независимыми друг от друга и добавить реализацию преобразователя матричного типа, которая знает оба типа матриц. Рассмотрим проблемы, если вы решите добавить другие типы матриц: вам придется модифицировать экспоненциальное количество файлов, чтобы добавить преобразования. Чтобы максимально упрощенно дизайн мог выглядеть так:

regmatrix.h:

class RegMatrix {
 // stuff, no mention of SparseMatrix
};

спарсматрикс.ч:

class SparseMatrix {
 // stuff, no mention of RegMatrix
};

convertions.cpp: (с объявлениями в convertions.h)

#include "sparsematrix.h"
#include "regmatrix.h"
#include "uppertriangular.h" // got it?
//...

namespace Conversions {
 void SparseToRegular(SparseMatrix& pTo, const RegMatrix& pFrom) { .. }
 void RegularToSparse(RegMatrix& pTo, const SparseMatrix& pFrom) { .. }
}  
person Paul Michalik    schedule 03.10.2010