লিনাক্সে স্ট্যাটিক লাইব্রেরি কীভাবে সংকলন করবেন?


138

আমার একটি প্রশ্ন আছে: কীভাবে লিনাক্সে একটি স্ট্যাটিক লাইব্রেরি সংকলন করতে হয় gcc, অর্থাত্ আমার নাম উত্সের ফাইলটি আমার উত্স কোডটি সংকলন করতে হবে need কমান্ডটি সহজভাবে সংকলন করা কি যথেষ্ট gcc -o out.a out.c? আমি এর সাথে তেমন পরিচিত নই gcc, আশা করি যে কেউ আমাকে হাত দিতে পারেন।


উত্তর:


206

Gnu সংকলক [gcc] এর সাথে একটি ভাগ করা এবং স্থির লাইব্রেরি তৈরি করা দেখুন

gcc -c -o out.o out.c

-c এর অর্থ এক্সিকিউটেবলের পরিবর্তে মধ্যস্থতাকারী অবজেক্ট ফাইল তৈরি করা।

ar rcs libout.a out.o

এটি স্ট্যাটিক লাইব্রেরি তৈরি করে। rপ্রতিস্থাপন সহ সন্নিবেশ করা cমানে , একটি নতুন সংরক্ষণাগার তৈরি করা, এবং sএকটি সূচক লেখার অর্থ। সর্বদা হিসাবে, আরও তথ্যের জন্য ম্যান পৃষ্ঠা দেখুন।


89

এখানে একটি সম্পূর্ণ মেকফিল উদাহরণ:

Makefile

TARGET = prog

$(TARGET): main.o lib.a
    gcc $^ -o $@

main.o: main.c
    gcc -c $< -o $@

lib.a: lib1.o lib2.o
    ar rcs $@ $^

lib1.o: lib1.c lib1.h
    gcc -c -o $@ $<

lib2.o: lib2.c lib2.h
    gcc -c -o $@ $<

clean:
    rm -f *.o *.a $(TARGET)

মেকফাইল ব্যাখ্যা:

  • target: prerequisites - নিয়ম প্রধান
  • $@ - মানে টার্গেট
  • $^ - মানে সমস্ত পূর্বশর্ত
  • $< - এর অর্থ হ'ল প্রথম শর্ত
  • ar- সংরক্ষণাগারগুলি তৈরি, সংশোধন এবং নিষ্কাশন করার জন্য একটি লিনাক্স সরঞ্জাম আরও তথ্যের জন্য ম্যান পৃষ্ঠাগুলি দেখুন । এই ক্ষেত্রে বিকল্পগুলির অর্থ:
    • r - সংরক্ষণাগারের ভিতরে বিদ্যমান ফাইলগুলি প্রতিস্থাপন করুন
    • c - ইতিমধ্যে বিদ্যমান না থাকলে একটি সংরক্ষণাগার তৈরি করুন
    • s - সংরক্ষণাগারটিতে একটি অবজেক্ট-ফাইল সূচক তৈরি করুন

উপসংহারে : লিনাক্সের অধীনে স্থির গ্রন্থাগার বস্তু ফাইলগুলির সংরক্ষণাগার ছাড়া আর কিছুই নয়।

main.c লিব ব্যবহার করে

#include <stdio.h>

#include "lib.h"

int main ( void )
{
    fun1(10);
    fun2(10);
    return 0;
}

lib.h libs প্রধান শিরোনাম

#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED

#include "lib1.h"
#include "lib2.h"

#endif

lib1.c প্রথম লিবি উত্স

#include "lib1.h"

#include <stdio.h>

void fun1 ( int x )
{
    printf("%i\n",x);
}

lib1.h সংশ্লিষ্ট শিরোনাম

#ifndef LIB1_H_INCLUDED
#define LIB1_H_INCLUDED

#ifdef __cplusplus
   extern C {
#endif

void fun1 ( int x );

#ifdef __cplusplus
   }
#endif

#endif /* LIB1_H_INCLUDED */

lib2.c দ্বিতীয় লিবি উত্স

#include "lib2.h"

#include <stdio.h>

void fun2 ( int x )
{
    printf("%i\n",2*x);
}

lib2.h সংশ্লিষ্ট শিরোনাম

#ifndef LIB2_H_INCLUDED
#define LIB2_H_INCLUDED

#ifdef __cplusplus
   extern C {
#endif

void fun2 ( int x );

#ifdef __cplusplus
   }
#endif

#endif /* LIB2_H_INCLUDED */

আদেশগুলি কী করবে এবং তারা কী অর্জন করতে চায় তা নির্দেশ করতে এটি সহায়তা করবে। বিশেষত এই ক্ষেত্রে arপ্রয়োজনীয়তার ব্যাখ্যা প্রয়োজন, কারণ এটি স্থির গ্রন্থাগার তৈরির মূল বিষয় key
জুস্ট

1
arপ্রোগ্রাম তৈরি করে, আর্কাইভ থেকে পরিবর্তন, এবং চায়ের, যা একটি কাঠামো এটা সম্ভব মূল পৃথক ফাইল পুনরুদ্ধার করে তোলে যে অন্যান্য ফাইল একটি সংগ্রহ অধিষ্ঠিত একটি একক ফাইল। arআপনি যখন সংশোধককে নির্দিষ্ট করেন তখন সংরক্ষণাগারটিতে স্থান পরিবর্তনযোগ্য অবজেক্ট মডিউলগুলিতে সংজ্ঞায়িত চিহ্নগুলিতে একটি সূচক তৈরি করে। (দেখুন man ar)
অ্যালেক্স 44

2
c++#ifdef __cplusplus extern "C" { #endif . . . #ifdef __cplusplus } #endif
সংকলকটি

12

জিসিসি দিয়ে অবজেক্ট ফাইলগুলি তৈরি করুন, তারপরে arএগুলি একটি স্ট্যাটিক লাইব্রেরিতে বান্ডিল করতে ব্যবহার করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.