التهيئة الثابتة وتدمير عوالم المكتبة الثابتة لا تحدث مع g++

StackOverflow https://stackoverflow.com/questions/1804606

سؤال

حتى وقت مضى، اعتقدت أن المكتبة الثابتة ‎.a هي مجرد مجموعة من ملفات الكائنات ‎.o، فقط يتم أرشفتها وعدم التعامل معها بشكل مختلف.لكن من الواضح أن الارتباط بكائن .o والارتباط بمكتبة ثابتة . تحتوي على كائن .o هذا ليسا متماثلين.ولا أفهم لماذا...

لننظر في ملفات التعليمات البرمجية المصدر التالية:

// main.cpp
#include <iostream>
int main(int argc, char* argv[]) {
    std::cout << "main" << std::endl;
}

// object.hpp
#include <iostream>
struct Object
{
    Object() { std::cout << "Object constructor called" << std::endl; }
    ~Object() { std::cout << "Object destructor called" << std::endl; }
};

// object.cpp
#include "object.hpp"
static Object gObject;

دعونا تجميع و وصلة وقم بتشغيل هذا الكود:

g++ -Wall object.cpp main.cpp -o main1
./main1
> Object constructor called
> main
> Object destructor called

يتم استدعاء المنشئ والمدمر لكائن gObject العام.

الآن لنقم بإنشاء ملف مكتبة ثابتة من الكود الخاص بنا واستخدامه (الرابط) في برنامج آخر:

g++ -Wall -c object.cpp main.cpp
ar rcs lib.a object.o
g++ -Wall -o main2 main.o lib.a
./main2
> main
  • لا يتم استدعاء منشئ ومدمر gObject ...لماذا ؟
  • كيف يتم الاتصال بهم تلقائيًا؟

شكرًا.

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

المحلول

.a المكتبات الثابتة تحتوي على عدة .o لكن لا يتم ربطها إلا إذا قمت بالرجوع إليها من التطبيق الرئيسي.
.o رابط الملفات مستقل دائما.

لذا .o الملفات الموجودة في الرابط تذهب دائمًا إلى الداخل، سواء تمت الإشارة إليها أم لا، ولكن من .a الملفات المشار إليها فقط .o ملفات الكائنات مرتبطة.

كملاحظة، لا يلزم تهيئة الكائنات العامة الثابتة حتى تشير فعليًا إلى أي شيء في وحدة الترجمة، حيث سيقوم معظم المترجمين بتهيئتها جميعًا قبل الرئيسية، ولكن الشرط الوحيد هو أن تتم تهيئتها قبل أن تحصل على أي وظيفة من وظائف وحدة الترجمة أعدم.

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