سؤال

أحاول كتابة مكتبة صفية صغيرة لدورة C++.

كنت أتساءل عما إذا كان من الممكن تحديد مجموعة من الفئات في كائني المشترك ثم استخدامها مباشرة في برنامجي الرئيسي الذي يعرض المكتبة.هل هناك أي حيل المعنية؟أتذكر أنني قرأت هذا منذ فترة طويلة (قبل أن أبدأ في البرمجة حقًا) أن فئات C++ تعمل فقط مع ملفات MFC .dlls وليس تلك العادية، ولكن هذا فقط جانب النوافذ.

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

المحلول

تعمل فئات C++ بشكل جيد في مكتبات .so المشتركة (تعمل أيضًا في مكتبات DLL غير تابعة لـ MFC على نظام التشغيل Windows، ولكن هذا ليس سؤالك حقًا).إنه في الواقع أسهل من Windows، لأنه لا يتعين عليك تصدير أي رموز بشكل صريح من المكتبات.

هذه الوثيقة سوف تجيب على معظم أسئلتك: http://people.redhat.com/drepper/dsohowto.pdf

الأشياء الرئيسية التي يجب تذكرها هي استخدام -fPIC الخيار عند التجميع، و -shared الخيار عند الارتباط.يمكنك العثور على الكثير من الأمثلة على الشبكة.

نصائح أخرى

الحل / الاختبار الخاص بي

هذا هو الحل الخاص بي وهو يفعل ما كنت أتوقعه.

شفرة

cat.hh :

#include <string>

class Cat
{
    std::string _name;
public:
    Cat(const std::string & name);
    void speak();
};

cat.cpp :

#include <iostream>
#include <string>

#include "cat.hh"

using namespace std;

Cat::Cat(const string & name):_name(name){}
void Cat::speak()
{
    cout << "Meow! I'm " << _name << endl;
}

main.cpp :

#include <iostream>
#include <string>
#include "cat.hh"

using std::cout;using std::endl;using std::string;
int main()
{
    string name = "Felix";
    cout<< "Meet my cat, " << name << "!" <<endl;
    Cat kitty(name);
    kitty.speak();
    return 0;
}

التحويل البرمجي

قمت بتجميع lib المشترك أولاً:

$ g++ -Wall -g -fPIC -c cat.cpp
$ g++ -shared -Wl,-soname,libcat.so.1 -o libcat.so.1 cat.o

ثم قم بتجميع البرنامج القابل للتنفيذ الرئيسي أو برنامج C++ باستخدام الفئات الموجودة في المكتبات:

$ g++ -Wall -g -c main.cpp
$ g++ -Wall -Wl,-rpath,. -o main main.o libcat.so.1 # -rpath linker option prevents the need to use LD_LIBRARY_PATH when testing
$ ./main
Meet my cat, Felix!
Meow! I'm Felix
$

كما أفهمها، هذا جيد طالما أنك تقوم بربط ملفات .so التي تم تجميعها جميعًا باستخدام نفس المترجم.يقوم المترجمون المختلفون بتشويه الرموز بطرق مختلفة وسيفشلون في الارتباط.

هذه إحدى مزايا استخدام COM على نظام التشغيل Windows، فهي تحدد معيارًا لوضع كائنات OOP في مكتبات الارتباط الحيوي (DLL).يمكنني تجميع ملف DLL باستخدام GNU g++ وربطه بملف EXE المترجم باستخدام MSVC - أو حتى VB!

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