Ошибка связывания Visual C ++ LNK2019 с предварительно скомпилированным заголовком

StackOverflow https://stackoverflow.com/questions/962879

Вопрос

У меня была очень странная проблема с заголовком предварительной компиляции.Компоновщик генерирует 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();
   ...
};
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top