واجهة - استخدام C/C++ مكتبات ثابتة من تطبيقات فون أوبجكتيفيك




مكتبات++c (3)

في الأساس عند ترجمة الدالات C مع مترجم C ++ فإنه يتشابك أسماء الدالة ويستخدم C + أبي.

عند استخدام ملحق * .cpp أو * .mm تستخدم محول C ++.

ما تريد القيام به هو إجبار المترجم على توليد وظائف C مع أسماء أون-مانغلز واستخدام C أبي.

يمكنك القيام بذلك إما عن طريق:

  • ترجمة مع مترجم C.
  • ترجمة مع مترجم C ++ ولكن تأكد من أن البادئة إعلانات وظيفة مع الخارج "C"

وهناك طريقة مفضلة لإعداد ملف الرأس، بحيث يمكن تضمين نفس الملف من ملفات المصدر C و C ++ هو:

#ifndef HEADER_GUARD_1_H
#define HEADER_GUARD_1_H

#ifdef __cplusplus
extern "C" {
#endif

// Declare C function interface here.
int myFunc(int x,char*);

#ifdef __cplusplus
}
#endif

#endif 

https://code.i-harness.com

هل من الممكن أن يكون لديك C مكتبة ثابتة أبي، والذي يستخدم C ++ داخليا وإخفاء هذا من مستخدمي المكتبة؟

لدي وريتن مكتبة C ++ المحمولة أود أن ربط ثابت إلى تطبيق فون.

لقد أنشأت مشروع كسكودي باستخدام قالب "مكتبة ثابتة" ماكس أوس X، ونسخ المصدر عبر، وكذلك كتابة C وابر (للتعامل مع الاستثناءات) باستخدام (خارج "C").

أنا أحاول استخدام مكتبة ولدت (ملف .a) في تطبيق آخر الكاكاو فون.

كل شيء يعمل بشكل جيد إذا كنت تستخدم (.mm) التمديدات على ملف أوبجكتيفيك الدعوة و (.cpp) على فئة التنفيذ في المكتبة.

ولكن أحصل على رموز لم يتم حلها على ربط عندما أحاول وتغيير ملف المجمع إلى (.c) إكستنتيون، على الرغم من أن كافة الملفات وظيفة المجمع هي فقط وظائف C.

فقط بيكوس C ++ يستخدم داخليا في مكتبة، هل يعني أنه خارجيا لا يزال يجب أن تعامل على أنها برنامج C ++. أليس هناك على أية حال فرض هذا التجريد؟

تحرير: شكرا للردود،

كنت قد استخدمت الخارجي "C"، وكنت فقط غير متأكد حول ما تكوينات حيث الحاجة في مشروع الدعوة. أي. إذا كانت الدعوة المتوقعة تتطلب معرفة ما إذا كان يستخدم C ++ أو يمكن أن يكون جاهل والتفكير في مكتبة C بحتة.

يبدو أنني لا أستطيع، ويجب أن استخدام ملفات (. مم) على فصول أوبجكتيفيك بلدي.


من الصعب جدا القيام بذلك في التعليقات، لذلك أنا فقط سوف تظهر لك بسرعة ما القضايا ربط هي التي تواجهها. عندما يواجه كسكودي الملفات، فإنه يستخدم قواعد بناء على لاحقة لتحديد أي مترجم للاستخدام. بشكل افتراضي، غك يربط الملفات إلى مكتبة C القياسية، ولكن لا يرتبط مع مكتبة C ++ القياسية. ملفات الأرشيف (المكتبات الثابتة) ليس لها أي قرار ربط على الإطلاق. وهي في الأساس أرشيف لملفات الكائنات التي تحتاج إلى ربطها . وبما أنه ليس لديك ملفات .mm أو .cpp في مشروعك، لا يتم استدعاء G ++ مطلقا ولا ترتبط ملفاتك مطلقا بالمكتبات القياسية. لتصحيح ذلك، فقط قم بإضافة مكتبات C ++ القياسية إلى أعلام رابط أخرى في مشروع كسكودي الخاص بك، أو ببساطة إضافتها إلى خيار أعلام أخرى محددة مسبقا كما -l (على سبيل المثال، -lstdc ++).

هنا هو مظاهرة سريعة:

stw.h:

#ifdef __cplusplus
extern "C"
#endif
void show_the_world(void);

stw.cpp:

#include <iostream>
#include "stw.h"
using namespace std;

extern "C" void show_the_world() {
  cout << "Hello, world!\n";
}

إنشاء المكتبة:

$ g++ -c stw.cpp -o stw.cpp -O0 -g
$ ar rcs stw.a stw.o

استخدام المكتبة من تطبيق C:

myapp.c:

#include "stw.h"

int main() {
  show_the_world();
  return 0;
}

بناء تطبيق C:

$ gcc -o myapp myapp.c stw.a -lstdc++ -g -O0
$ ./myapp
Hello, world!
$

إذا حاولت تجميع بدون -lstdc ++ سوف تحصل على جميع القضايا التي لم يتم حلها لأن المترجم C لديه أي فكرة على الإطلاق أنه ينبغي أن تصل إلى وقت التشغيل C ++ (ولماذا سيكون ذلك، أليس كذلك؟؟!؟) بحيث يكون لديك لإضافة هذا يدويا. الخيار الآخر لديك هو تغيير قاعدة بناء لمشروعك ... بدلا من وجود كسكودي استخدام غك لبناء ملفات .c و. m، أقول ذلك لاستخدام g ++ وسيتم حل القضايا الخاصة بك.


شكرا، على هذا النقاش الجيد.

ما فعلته هو:

1) أنا خلقت ليب ثابت باستخدام كوكاوتش لمس خيار ثابت. في أن لدي ج / ج ++ / أوبج-ج كل مزيج. ومع ذلك، صادرات بلدي هي فقط فئات أوبج-ج. إنفاكت أنا استخدم أوبجك إلى c إلى C ++.

2) ثم أنا كريتد فون التطبيق في X- رمز بروج. أضفت أعلام الارتباط الأخرى اسم لي (-lxyz) // اسمي ليب هو libxyz.a لقد أضفت مسار البحث ليب، مسار البحث رأس

3) ثم جمعت. حصلت على أخطاء. قائلا أويبراتور جديد، حذف المشغل لم يتم العثور عليها.

3) ثم بصرف النظر بلدي أبديليغات، عرض تحكم، أضفت الدمية كبب (.h، .cpp) ... atestdummy.h atestdummy.cpp

4) ثم بناء مرة أخرى ...

أنها عملت.

لذلك - أنا أي اقتراحات قدموها في وقت سابق عملت لي. السبب الأساسي، ما لم التطبيق أور يرى ملف .cpp ملف .mm مع رمز كبب، مرتبطة لن تستخدم ز ++.

شكرا لكم جميعا. لقد قرأت أعلاه و سولفد مشكلتي.

ش الرجال جيدة للمشاركة.





c