Ошибка связывания Visual C ++ LNK2019 с предварительно скомпилированным заголовком
-
12-09-2019 - |
Вопрос
У меня была очень странная проблема с заголовком предварительной компиляции.Компоновщик генерирует LNK2019:неразрешенная ошибка внешнего символа при реализации метода в файле .cpp.Однако программа может быть скомпилирована, если я реализую метод в файле .h.Мне удалось найти решение, но я понятия не имею о первопричине этой ошибки.
Структура моего проекта выглядит следующим образом
Решение
-> проект 1
-> проект 2
Проект 1 содержит 3 файла.A.h, A.cpp и stdafx.h
file A.h
#pragma once
class A
{
public:
int num;
A();
};
file A.cpp
#include "stdafx.h"
A::A()
{
num = 2;
}
file stdafx.h
...
#include "A.h"
...
В проекте 2.Я хочу использовать класс.
файл whatever.cpp
#include "stdafx.h"
#include "../Project1/A.h"
...
A* a_obj = new A();
...
Во время компиляции компоновщик сообщает о неразрешенной ошибке внешнего символа для конструктивной функции A.Если я реализую конструктор в файле A.h.проект 2 может быть успешно выполнен.Я хочу знать, почему нельзя поместить реализацию в файл A.cpp ?Как правильно организовать заголовок предварительной компиляции?
Спасибо
Решение
Проект 2 не включает определение конструктора A - один из способов сделать это видимым - включить определение в файл заголовка (что вы и сделали).
Другим способом было бы включить файл A.cpp в проект 2.
Третьим способом было бы экспортировать класс A или конструктор A, используя файл .def или используя dllexport
директива.
Поместите это в предварительно скомпилированный заголовочный файл:
// set up export import macros for client project use
// define the symbol "PROJ1" before including this file in project 1 only
// leave it undefined for other projects
#ifdef PROJ1
#define DLLEXP __declspec(dllexport)
#else
#define DLLEXP __declspec(dllimport)
#endif
Затем объявите класс A в заголовке A:
DLLEXP class A
{
public:
A();
...
};
Или:
class A
{
public:
DLLEXP A();
...
};