0

我对预编译头有一个非常奇怪的问题。当我在 .cpp 文件中实现方法时,链接器生成 LNK2019: unresolved external symbol 错误。但是,如果我在 .h 文件中实现方法,则可以编译程序。我碰巧找到了解决方案,但我不知道这个错误的根本原因。

我的项目结构是这样的

解决方案
-> 项目 1
-> 项目 2

项目 1 有 3 个文件。啊,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 中。我想使用 A 类。

文件whatever.cpp

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

在编译时,链接器报告 A 构造函数的未解决的外部符号错误。如果我在 Ah 文件中实现构造函数。project2 可以成功编译。我想知道,为什么不能把实现放在 A.cpp 文件中?组织预编译头文件的正确方法是什么?

谢谢

4

1 回答 1

1

项目 2 不包含 A 构造函数的定义 - 使其可见的一种方法是将定义包含在头文件中(您已经这样做了)。

另一种方法是在项目 2 中包含 A.cpp 文件。

第三种方法是使用 .def 文件或使用dllexport指令导出 A 类或 A 构造函数。

把它放在预编译的头文件中:

// 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();
   ...
};
于 2009-06-07T21:42:27.617 回答