كتابة DLL في Visual Studio في C (وليس C ++) مما تسبب في رموز غير حل

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

  •  19-09-2019
  •  | 
  •  

سؤال

لقد كنت أذهب إلى DLL Watchhrough MSDN. ويعمل بشكل جيد. ثم قمت بإزالة كل رمز نمط C ++ في DLL واستبدالها باستخدام المكافئ C، وما زال يعمل.

ولكن، عندما أعيد تسمية الملف من X.CPP إلى XC (الذي أعتقد أن يؤدي إلى تجميع في وضع C)، أحصل على خطأ LNK2019 (رمز خارجي لم يتم حلها) لكل وظيفة في DLL. لأغراضي، من الضروري أن يكون DLL في C وليس C ++ لأن هذا ما يدعمه Java Access الأصلية.

إليك رأس DLL:

__declspec(dllexport) double Add(double a, double b);
__declspec(dllexport) double Subtract(double a, double b);
__declspec(dllexport) double Multiply(double a, double b);
__declspec(dllexport) double Divide(double a, double b);

إليك برنامج اختبار (C ++) الذي يستخدم DLL:

#include <iostream>
#include "MyMathFuncs.h"
using namespace std;
int main()
{
    double a = 7.4;
    int b = 99;

    cout << "a + b = " <<
        Add(a, b) << endl;
    cout << "a - b = " <<
        Subtract(a, b) << endl;
    cout << "a * b = " <<
        Multiply(a, b) << endl;
    cout << "a / b = " <<
        Divide(a, b) << endl;

    return 0;
}

(فقط لتوضيح أنه من الجيد أن يكون برنامج الاختبار في C ++؛ إنه فقط DLL أحاول تجميعه في ج).

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

المحلول

يضيف

extern "C"
{
#include "MyMathFuncs.h"
}

نصائح أخرى

بعد تغيير التمديد، يمكنك الآن استخدام الأسماء الخاطئة في رمز العميل. لم تعد هذه الأسماء مصممة لأنها كانت عندما تقوم بتجميعها ك Code C ++. الطريقة المناسبة لتصدير أسماء مثل هذا، بحيث لا تستخدم هذه الزخارف أبدا ولا تعتمد على اللغة:

extern "C" __declspec(dllexport)
double Add(double a, double b);

لمعرفة الأسماء المصدرة، استخدم Dumpbin.exe / الصادرات على DLL الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top