Ошибка связывания Visual C ++ LNK2019 с предварительно скомпилированным заголовком - PullRequest
0 голосов
/ 08 июня 2009

У меня была очень странная проблема с заголовком прекомпиляции. Компоновщик генерирует 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. Я хочу использовать класс А.

файл what.cpp

#include "stdafx.h"
#include "../Project1/A.h"
...
    A* a_obj = new A();
...

Во время компиляции компоновщик сообщает о неразрешенной внешней ошибке символа для функции построения A. Если я реализую конструктор в файле A.h. проект2 может быть успешно выполнен. Я хочу знать, почему нельзя поместить реализацию в файл A.cpp? Как правильно организовать прекомпиляцию заголовка?

Спасибо

1 Ответ

1 голос
/ 08 июня 2009

Проект 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();
   ...
};
...