У меня есть визуальное решение для студии с несколькими проектами. Одним из них, «MyProject», является статическая библиотека (.lib). Проект, среди многих других классов, имеет два класса «А» и «В».
хиджры:
#pragma once
class A
{
public:
void foo();
};
a.cpp:
#include A.h
void A::foo(){
//do something
}
B.h:
#pragma once
class B
{
public:
void bar();
};
B.cpp:
#include B.h
#include A.h
void B::bar(){
A a;
a.foo();
}
Без ошибок компиляции я получаю ошибку компоновки:
OtherProject.lib (B.obj): ошибка LNK2019: неразрешенный внешний символ «public: void __thiscall
A :: foo (void) «(? Foo @ A @@ QAE_NXZ), на которую ссылается функция» public: void
__thiscall B :: bar (void) «(? bar @ B @@ QAEXXZ)
Кажется, все в порядке. Я вижу процесс компиляции A.cpp. Сборка или связывание только проекта «MyProject» — это нормально. Но при попытке построить полное решение я получаю ошибку.
Спасибо!
Оказывается, есть еще один проект OtherProject
это включает в себя класс B
и использует его функцию bar()
, Я недостаточно хорошо прочитал ошибку и не заметил, что ошибка компоновки возникает в другом проекте. Все, что мне нужно было сделать, это включить A.cpp
в OtherProject
,
В Visual-Studio большинство проблем со связыванием связано с отсутствием добавления .cpp
файлы.
Проверьте все файлы реализации добавляются в проект. Затем очистите и постройте свой проект.
Либо реализация этого метода закомментирована в A.cpp:
void A::foo(){
//do something
}
Или же A.cpp
не входит в сборку проекта. Щелкните правой кнопкой мыши A.cpp в обозревателе решений и выберите Свойства, чтобы увидеть, исключено ли оно из сборки. Когда вы строите, вы видите это:
1>Compiling...
1>A.cpp
Я набрал этот код в моей Visual Studio, и он работал нормально.