سؤال

كان لدي مشكلة غريبة للغاية مع رأس precompile. يولد الرابط LNK2019: خطأ رمز خارجي لم يتم حله عند تطبيق الأسلوب في ملف .cpp. ومع ذلك، يمكن تجميع البرنامج إذا قمت بتطبيق الأسلوب في ملف .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. أريد استخدام فئة.

ملف Other.cpp.

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

في وقت ترجمة، تقارير الرابط غير المحسوق خطأ رمز خارجي لموظيفة البناء. إذا قمت بتطبيق المنشئ في ملف آه. يمكن أن تكون المشروع 2 ناجحة. أريد أن أعرف، لماذا لا يمكن وضع التنفيذ في ملف A.CPP؟ ما هي الطريقة الصحيحة لتنظيم رأس بريموميلي؟

شكرا لك

هل كانت مفيدة؟

المحلول

لا يشمل المشروع 2 تعريف المنشئ - طريقة واحدة لإعطائها رؤية ذلك لتضمين التعريف في ملف الرأس (الذي قمت به).

طريقة أخرى ستكون لتضمين ملف A.CPP في المشروع 2.

سيكون الطريق الثالث لتصدير الفصل، أو المنشئ باستخدام ملف .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

ثم أعلن الفصل في رأس:

DLLEXP class A
{
  public:
    A();
   ...
};

أو:

class A
{
  public:
    DLLEXP A();
   ...
};
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top