vc++ неразрешенный внешний символ (невозможно вызвать конструктор)

У меня есть решение VC++ с двумя проектами. Проект B ссылается на проект A. Проект B также имеет в качестве каталога включения (Свойства/Свойства конфигурации/C++/Дополнительные каталоги включения) папку из проекта A. Пространства имен не используются.

Когда я импортирую заголовок из класса Project A, такого как #include "someFolder\SomeClass.h", я могу объявить указатель на класс.

SomeClass *sc;

Но как только я вызову конструктор, он не скомпилируется. IntelliSense не показывает никаких ошибок.

SomeClass *sc = new SomeClass("someString");

Я получил:

ошибка LNK2001: "неразрешенный внешний символ" public_thiscall SomeClass::SomeClass(..." и "ошибка LNK1120: 1 неразрешенный внешний символ".

Конструктор является общедоступным, как и методы из SomeClass. Самое смешное, что у меня компилируется при вызове методов из SomeClass в Project B. Только cunstructor вроде не работает.


person user764754    schedule 14.11.2011    source источник
comment
Это явно ошибка компоновщика, а не ошибка компилятора. Таким образом, такие вещи, как доступность, не являются проблемой. Правильно ли вы соединяете все свои единицы перевода?   -  person Kerrek SB    schedule 14.11.2011


Ответы (2)


Вы должны связать объектный код, скомпилированный из "SomeClass.cpp". Если проект A компилируется в статическую библиотеку, добавьте на нее ссылку.

person kol    schedule 14.11.2011
comment
Я могу сам решить, какой проект A компилировать, потому что у меня есть исходники (я использовал .exe в описанной проблеме). Какой самый простой способ связать код объекта, пожалуйста? Я не знаю, как это сделать. - person user764754; 14.11.2011
comment
Я думаю, что лучший вариант — скомпилировать Project A как статическую библиотеку (*.lib) и поместить ее путь в зависимости Linker/Input/Additional. Вы можете использовать сам cpp, объектный файл, dll или exe, но обычно используется lib. - person kol; 14.11.2011
comment
Хорошо, A.lib теперь находится в папке Debug из решения. Значение дополнительных зависимостей теперь равно A.lib;%(AdditionalDependencies). К сожалению, теперь я получаю ошибку компоновщика: ошибка LNK1104: невозможно открыть файл A.lib' - person user764754; 14.11.2011
comment
Вы также должны добавить путь, а не только имя файла. - person kol; 14.11.2011
comment
Отлично, теперь работает спасибо. Я использовал Debug/A.lib. Вместо добавления пути здесь также можно добавить полный путь до отладки в каталоги компоновщика/общих/дополнительных библиотек. - person user764754; 14.11.2011

Исходник компилируется, это ошибка компоновщика. Вам нужно добавить файлы библиотеки (.lib) из проекта A в команду компоновщика в проекте B.

person hmjd    schedule 14.11.2011