سؤال

أقيم حزمة سيتم استخدامها بواسطة R (البرنامج الإحصائي)، أنا لست خبيرا في استخدام هذا التطبيق، لكنني تمكنت من إنشاء حزمة بسيطة للغاية، باستخدام المنطق التالي، لدي بعض الفئات في C ++، كما يجب تجميع الكود باستخدام برنامج الترجمة الروبية، فإنه يسمح فقط C-Code Code، لدي رمز Grapper C يسميه أساليب C ++، ثم لدي برنامج نصي هو استدعاء الأساليب المكشوفة بواسطة رمز C، لذلك أساسا هو التواصل مثل R <-> C <-> C ++.

تم العثور على البرنامج التعليمي الكامل الذي استخدمته لإنشاء هذه الحزمة هنا, ، أضيفها كمرجع.

الآن مشكلتي هي أنني بحاجة إلى إضافة بعض الوظائف إلى الحزمة التي قمت بإنشائها بالفعل، ما أحتاج إلى القيام به هو إضافة رمز للتغليف المتأخر إلى كائن COM الذي هو منتج آخر قمت بإنشائه وهو مسجل باستخدام أداة Regasm.

هذا هو رمز C ++ الذي أستخدمه لمحاولة الربط في وقت متأخر على كائن COM، أحاول استخدام IDispatch للقيام بذلك:

{
...
CLSID clsid;    
HRESULT hr = CLSIDFromProgID((WCHAR*)"My Com object ProgId", &clsid);
if(FAILED(hr))                      
  return;   
...     
}

لم أصب الرمز بأكمله لأنه فقط مع هذه الخطوط، فإن المحول البرمجي يعطيني مشاكل بالفعل، والأمر الذي تستخدمه لتجميعه هو

R CMD SHLIB Cclass.cc C++class.cc

حيث "cclass.cc" لديه رمز C الذي يسميه أساليب C ++ و "C ++ Class.cc" هو في الواقع رمز C ++.

عندما أرسم هذه الفئات، يقول المحول البرمجي

"undefined reference to `CLSIDFromProgID@8'collect2: ld returned 1 exit status"

أنا متأكد من أنني أضفت جميع ملفات الرأس التي أحتاجها، ولهذا السبب أعتقد أن مشكلتي هي أنني لا أشمل OLE32.LIB و OLEAUT32.LIB التي هي مكتبات ثابتة.

لذلك، سؤالي هو، كيف يمكنني تضمين هذه المكتبات من أجل أن أكون قادرا على استخدام طرق الربط المتأخر، مثل CLSIDFROMPROGID (...) أو QueryInterface (...). أيضا إذا كان أي شخص يعتقد أن مشكلتي لا تربط هذه المكتبات، ولكن هناك شيء آخر، فسيكون الأمر رائعا إذا كان يمكن أن يشير إلى أي مشكلتي.

في الاعتبار أيضا أنني بحاجة إلى الارتباط مع مكتبات الإحصاءات هذه بطريقة يمكن تجميعها دون مشكلة من قبل مترجم r، والتي إذا لم أكن مخطئا هو مترجم C فقط.

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

المحلول

لم أحاول القيام بذلك مع C / C ++ ولكن مع FORTRAN. كان لدي مشكلة مماثلة في أن بعض مكتبات IO القياسية لم يتم تضمينها في المكتبة التي تم إنشاؤها. في النهاية، قمت بتضمينها للتو جميعا وتجميعها باستخدام برنامج التحويل البرمجي FORTRAN. لم أستخدم أيا من أدوات المرافق الأساسية الخاصة، والتي تم تجميعها فقط كما لو كنت تجميع مكتبة فورتران ثابتة عادة للاستخدام مع أي شيء آخر. هذا يعمل بشكل جيد.

قد يتم ترجمة مسار التصحيح ككتبة ثابتة باستخدام دول مجلس التعاون الخليجي (أو ما تستخدمه)، ثم حاول تضمين هذه المكتبة الثابتة من برنامج ج آخر، ثم إذا كان ذلك يعمل مع R.

آمل أن يكون هذا مفيدا، وكتابة حزم r هذه بجد إلا إذا كنت تستخدم الفانيليا ج أو فورتران بقدر ما أستطيع أن أقول.

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