Làm thế nào để biên dịch một thư viện tĩnh trong Linux?


138

Tôi có một câu hỏi: Làm thế nào để biên dịch một thư viện tĩnh trong Linux gcc, tức là tôi cần biên dịch mã nguồn của mình thành một tệp có tên out.a. Có đủ để biên dịch đơn giản với lệnh gcc -o out.a out.ckhông? Tôi không quen lắm gcc, hy vọng ai cũng có thể giúp tôi.


kiểm tra cái này
Kế toán م

Câu trả lời:


205

Xem phần Tạo thư viện chia sẻ và tĩnh với trình biên dịch gnu [gcc]

gcc -c -o out.o out.c

-c có nghĩa là tạo một tệp đối tượng trung gian, chứ không phải là tệp thực thi.

ar rcs libout.a out.o

Điều này tạo ra thư viện tĩnh. rcó nghĩa là chèn với thay thế, ccó nghĩa là để tạo một kho lưu trữ mới và scó nghĩa là để viết một chỉ mục. Như mọi khi, xem trang người đàn ông để biết thêm.


89

Dưới đây là một ví dụ makefile đầy đủ:

trang điểm

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)

giải thích về makefile:

  • target: prerequisites - người đứng đầu quy tắc
  • $@ - có nghĩa là mục tiêu
  • $^ - có nghĩa là tất cả các điều kiện tiên quyết
  • $< - có nghĩa chỉ là điều kiện tiên quyết đầu tiên
  • ar- một công cụ Linux để tạo, sửa đổi và trích xuất từ ​​kho lưu trữ xem các trang hướng dẫn để biết thêm thông tin . Các tùy chọn trong trường hợp này có nghĩa là:
    • r - thay thế các tập tin hiện có trong kho lưu trữ
    • c - tạo một kho lưu trữ nếu chưa tồn tại
    • s - tạo một chỉ mục tệp đối tượng vào kho lưu trữ

Để kết luận : Thư viện tĩnh trong Linux không gì khác hơn là một kho lưu trữ các tệp đối tượng.

main.c sử dụng lib

#include <stdio.h>

#include "lib.h"

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

lib.h tiêu đề chính của libs

#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED

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

#endif

lib1.c nguồn lib đầu tiên

#include "lib1.h"

#include <stdio.h>

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

lib1.h tiêu đề tương ứng

#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 nguồn lib thứ hai

#include "lib2.h"

#include <stdio.h>

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

lib2.h tiêu đề tương ứng

#ifndef LIB2_H_INCLUDED
#define LIB2_H_INCLUDED

#ifdef __cplusplus
   extern C {
#endif

void fun2 ( int x );

#ifdef __cplusplus
   }
#endif

#endif /* LIB2_H_INCLUDED */

nó sẽ giúp chỉ ra những gì các lệnh làm, và những gì họ dự định đạt được. đặc biệt trong trường hợp này arcần giải thích, vì nó là chìa khóa để tạo thư viện tĩnh.
Joost

1
Các archương trình tạo ra, sửa đổi, và các chiết xuất từ kho lưu trữ, mà là một tập tin duy nhất giữ một bộ sưu tập các tập tin khác trong một cấu trúc mà làm cho nó có thể lấy các tập tin cá nhân ban đầu.artạo một chỉ mục cho các ký hiệu được xác định trong các mô đun đối tượng có thể định vị lại trong kho lưu trữ khi bạn chỉ định s bổ nghĩa. (xem man ar)
Alex44

2
vui lòng thêm các dòng sau vào tiêu đề của bạn để hỗ trợ c++trình biên dịch: #ifdef __cplusplus extern "C" { #endif . . . #ifdef __cplusplus } #endif
Behrouz.M

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.