هل هناك طريقة لقمع c ++ اسم المشاهير؟
-
05-09-2019 - |
سؤال
لدي DLL مكتوب في C ++ وأريد قمع اسم المشاهير للحصول على عدد قليل من الأساليب المصدرة. الأساليب عالمية وليس أعضاء في أي فئة. هل هناك طريقة لتحقيق ذلك؟
راجع للشغل: أنا أستخدم VS2008.
المحلول
"bradtgmurray" هو الصحيح، ولكن لمجمعات التحويل البرمجانية Visual C ++، تحتاج إلى تصدير وظيفتك بشكل صريح على أي حال. ولكن باستخدام ملف .def كما هو مقترح من قبل "سيرج - APPTranslator" هو الطريقة الخطأ للقيام بذلك.
ما هي الطريقة العالمية لتصدير الرموز على Visual C ++؟
باستخدام تعليمات DELLSPEC (DLLEXPORT / DLLIMPORPORT)، والتي تعمل في كلا من التعليمات البرمجية C و C ++، مزينة أو لا
لذلك، فإن الطريقة الصحيحة لتصدير الوظائف غير المعروفة في Visual C ++ هي الجمع بين الصادرات "C" المصنوعة، كما تم الرد عليها "Bradtgmurray"، وكلمة DLLIMPORT / DLLEXPORT الرئيسية.
مثال ؟
كمثال، قمت بإنشائه على Visual C ++ مشروع DLL فارغ، وكتب وظيفتين، واحد يطلق عليه CPP لأنه تم تزيينه، والآخر جيجا لأنه لم يكن كذلك. الرمز هو:
// Exported header
#ifdef MY_DLL_EXPORTS
#define MY_DLL_API __declspec(dllexport)
#else
#define MY_DLL_API __declspec(dllimport)
#endif
// Decorated function export : ?myCppFunction@@YAHF@Z
MY_DLL_API int myCppFunction(short v) ;
// Undecorated function export : myCFunction
extern "C"
{
MY_DLL_API int myCFunction(short v) ;
} ;
أعتقد أنك تعرف بالفعل، ولكن من أجل الاكتمال، يجب تعريف الماكرو My_dll_api في DLL Makefile (أي VCProj)، ولكن ليس بواسطة مستخدمي DLL.
رمز C ++ سهل الكتابة، ولكن من أجل اكتمال، سأكتبه أدناه:
// Decorated function code
MY_DLL_API int myCppFunction(short v)
{
return 42 * v ;
}
extern "C"
{
// Undecorated function code
MY_DLL_API int myCFunction(short v)
{
return 42 * v ;
}
} ;
نصائح أخرى
تحيط تعريفات الوظيفة مع خارجية "C" {}
extern "C" {
void foo() {}
}
يرى http://www.parashift.com/c+-faq-lite/mixing-C-and-cpp.html.
يمكنك تجنب جميع Manglings (C ++، CDECL، STDCALL، ...) للوظائف المصدرة باستخدام ملف .DEF مع قسم الصادرات. ما عليك سوى إنشاء ملف mydll.def وإضافته إلى مشروعك:
LIBRARY "MyDLL"
EXPORTS
Foo
Bar
في الواقع، الفرص هي المعالج إنشاء ملف DEF بالفعل بالفعل. عليك فقط ملء قسم الصادرات.