سؤال

أحاول استخدام مكتبة Oracle OCI مع برنامج التحويل البرمجي Mingw64. إذا قمت بربط OCI.LIB المقدم بواسطة Oracle ، فإن برنامج 64Bit الخاص بي يعطل ، لأنه على ما يبدو Mingw64 لا يدعم الارتباط مع DLL الذي تم إنشاؤه باستخدام VC.

يبدو أن الحل البديل لهذا هو:

1) قم بإنشاء ملف DEF من OCI.DLL ، وهو ما أقوم به مع MINGW64 Gendef (إذا كنت أستخدم هذا الأمر "Dlltool -z oci.def-Adving-All-Symbol oci.dll" أحصل على ملف DEF فارغ ، بينما إذا استخدمت Gendef ، أحصل على ملف DEF مكتوب بالسكان)

2) إنشاء مكتبة استيراد OCI.A مع dlltool ("dlltool -d oci.def -l liboci.a")

ومع ذلك ، فإن مكتبة OCI.A التي أقوم بإنشائها مع DllTool هي ملف فارغ. في أعمال أخرى ، يبدو أنني غير قادر على إنشاء مكتبة OCI.A ، ويجب أن أستخدمها لربط البرنامج الخاص بي إلى OCI.DLL

هل يعرف أحد كيفية حل هذه المشكلة؟ هل شخص قادر على أداء هذه المهمة بشكل صحيح؟

شكرًا لك

ماركو

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

المحلول

لقد ولدت للتو liboci.a دون أي مشاكل. ربما أفسدت شيئًا ما أو استخدمت نهجًا غير صحيح (dlltool -z ...). هنا كيف تفعلها:

  1. تنزيل وتثبيت (يمكن أن تبني من المصدر) gendef خدمة:

    • إذا كان لديك المعتاد Mingw, ثم الحصول عليها هنا;
    • اذا كنت تمتلك Mingw-W64, ثم الحصول عليها هنا.
  2. يجري gendef oci.dll (سوف يولد oci.def);

  3. يجري dlltool -D oci.dll -d oci.def -l liboci.a (سوف يولد liboci.a);

  4. حاول الآن الارتباط ضد liboci.a.

ملاحظة: من فضلك ، تأكد من ذلك إذا oci.dll يستهدف x86 ، ثم dlltool يجب أن يكون من توزيع Mingw/Mingw-W64 الذي يستهدف x86 أيضًا. الشيء نفسه ينطبق على حالة X64 ، أي من المهم أن تتطابق البنى المستهدفة.

نصائح أخرى

قد لا ينطبق هذا المنشور على أنظمة 64 بت لكل ما أعرفه ، لكنه يعمل على النوافذ 32 بت ...

حاولت Gendef ، وفشلت في إنتاج ملف DEF. بعد حل هذه المشكلة بالفعل لأغراض بلدي في البدء في كتابة DLL ، أقترح استخدام Tiny_impdef.exe من TCC ، والذي يعمل. (TCC = مترجم صغير C ، من تأليف Fabrice Bellard ، وبعد ذلك ، Grishka.) والأكثر من ذلك ، على عكس DllTool (وربما Gendef) ، فإنه يعمل ما إذا كانت GCC تستخدم -S لتجريد DLL الإخراج أم لا!

استخدم DllTool لإنشاء ملف Library *.A من DEF ، إذا كان يستخدم GCC. ستقوم TCC ببناء DLL و EXE بالكامل ، باستخدام سطرين فقط. لديّ مجموعة من الأوامر التي ستتيح إما DLL ، أو EXE ، ببناءها بواسطة GCC ، أو TCC ، مع جميع المجموعات الأربعة المحتملة.

ملف الدُفعات أدناه ، للنهب في الإرادة ... أنا متأكد من أنه يمكن تحسينه ، ولكن على الأقل يعمل بشكل نظيف كما هو.

@ECHO OFF
REM This system seems to work regardless of which compiler makes the DLL or the EXE. Try to simplify for GCC.

أوامر REM TCC. يقوم بإنشاء 3 ملفات ، DLL و DEF ، ثم exe. rem e: coding tcc tcc.exe -shared e: coding tcc أمثلة test_dll test_dll.c -oe: الترميز tcc أمثلة test_dll test_dll.dll rem e: coding tcc tcc.exe e: coding tcc أمثلة test_dll test_exe.c e: coding tcc aormles test_dll test_dll.def -oe: coding tcc أمثلة test_dll test_dll.exe

أوامر REM GCC. تحذير! لا يزال يحتاج إلى TCC Tiny_impdef.exe! E: coding gcc bin gcc.exe -s -shared -ie: coding gcc include -mwindows e: coding tcc Argtaments test_dll test_dll.c - test_dll test_dll.dll e: coding tcc "tiny_impdef.exe" e: coding tcc Armords test_dll test_dll E: coding tcc أمثلة test_dll test_dll.def -le: الترميز tcc أمثلة test_dll libtest_dll.a e: coding gcc bin gcc.exe -s -i: include -mwindows e: coding tcc أمثلة test_dll test_exe.c e: coding tcc stest_dll libtest_dll.a -

ابدأ e: الترميز tcc أمثلة test_dll test_dll.exe

للاكتمال ، إليك رمز C للاختبار DLL:

#include <windows.h>
#define DLL_EXPORT __declspec(dllexport)

DLL_EXPORT void ZoodleWurdle(){
  MessageBox (0, "Wurdle", "Zoodle", MB_ICONINFORMATION);
}

DLL_EXPORT void MangleWurzel(){
  MessageBox (0, "Mangled", "Wurzels", MB_ICONINFORMATION);
}

آسف على Gummidgisms ، لكن كان علي أن أبدأ في مكان ما ، ولم أحب أبدًا Foo and Bar ، أو Hello and World ... إليك Exe:

#include <windows.h>
void ZoodleWurdle();
void MangleWurzel();

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
  ZoodleWurdle(); MangleWurzel();
  return 0;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top