จะรวบรวมไลบรารีแบบคงที่ใน Linux ได้อย่างไร?


141

ฉันมีคำถาม: วิธีการรวบรวมไลบรารีแบบคงที่ใน Linux ด้วยgccคือฉันต้องคอมไพล์ซอร์สโค้ดของฉันลงในไฟล์ชื่อ out.a. การคอมไพล์ด้วยคำสั่งนั้นเพียงพอgcc -o out.a out.cหรือไม่? ฉันไม่ค่อยคุ้นเคยgccหวังว่าใครจะช่วยฉันได้


คำตอบ:


212

โปรดดูการสร้างไลบรารีแบบแบ่งใช้และแบบคงที่ด้วยคอมไพเลอร์ gnu [gcc]

gcc -c -o out.o out.c

-c หมายถึงการสร้างไฟล์ออบเจ็กต์ตัวกลางแทนที่จะเป็นไฟล์ปฏิบัติการ

ar rcs libout.a out.o

สิ่งนี้จะสร้างไลบรารีแบบคงที่ rหมายถึงการแทรกโดยแทนที่cหมายถึงการสร้างที่เก็บถาวรใหม่และsหมายถึงการเขียนดัชนี เช่นเคยดูหน้าคนสำหรับข้อมูลเพิ่มเติม


93

นี่คือตัวอย่าง makefile แบบเต็ม:

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)

อธิบาย makefile:

  • target: prerequisites - หัวหน้ากฎ
  • $@ - หมายถึงเป้าหมาย
  • $^ - หมายถึงข้อกำหนดเบื้องต้นทั้งหมด
  • $< - หมายถึงข้อกำหนดเบื้องต้นแรกเท่านั้น
  • ar- เครื่องมือ Linux เพื่อสร้างแก้ไขและสารสกัดจากจากที่เก็บไว้ดูหน้าคนสำหรับข้อมูลเพิ่มเติม ตัวเลือกในกรณีนี้หมายถึง:
    • r - แทนที่ไฟล์ที่มีอยู่ในที่เก็บถาวร
    • c - สร้างที่เก็บถาวรหากยังไม่มีอยู่
    • s - สร้างดัชนีออบเจ็กต์ไฟล์ลงในไฟล์เก็บถาวร

สรุป : ไลบรารีแบบคงที่ภายใต้ Linux ไม่ได้เป็นอะไรมากไปกว่าที่เก็บไฟล์อ็อบเจ็กต์

main.c โดยใช้ lib

#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 แหล่งแรก lib

#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 แหล่งที่สอง lib

#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คำอธิบายความต้องการเนื่องจากเป็นกุญแจสำคัญในการสร้างไลบรารีแบบคงที่
Joost

1
arโปรแกรมสร้างปรับเปลี่ยนและสารสกัดจากคลังซึ่งเป็นไฟล์เดียวถือคอลเลกชันของไฟล์อื่น ๆ ในโครงสร้างที่ทำให้มันเป็นไปได้ที่จะดึงไฟล์แต่ละไฟล์ต้นฉบับ arสร้างดัชนีให้กับสัญลักษณ์ที่กำหนดไว้ในโมดูลอ็อบเจ็กต์ที่ย้ายตำแหน่งได้ในไฟล์เก็บถาวรเมื่อคุณระบุโมดิฟายเออร์ s (ดูman ar)
Alex44

2
โปรดเพิ่มบรรทัดต่อไปนี้ในส่วนหัวของคุณเพื่อสนับสนุนc++คอมไพเลอร์: #ifdef __cplusplus extern "C" { #endif . . . #ifdef __cplusplus } #endif
Behrouz.M

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.