2010-04-29 32 views
99

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 với gcc, tức là tôi cần phải biên dịch mã nguồn của tôi thành một tệp có tên out.a. Có đủ để đơn giản biên dịch với lệnh gcc -o out.a out.c không? Tôi không khá quen thuộc với gcc, hy vọng mọi người có thể cho tôi một tay.Làm thế nào để biên dịch một thư viện tĩnh trong linux?

Trả lời

154

Xem Creating a shared and static library with the gnu compiler [gcc]

gcc -c -o out.o out.c 

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

ar rcs libout.a out.o 

Điều này tạo thư viện tĩnh. r có nghĩa là để chèn với thay thế, c có nghĩa là để tạo một kho lưu trữ mới, và s có nghĩa là để viết một chỉ mục. Như mọi khi, hãy xem man page để biết thêm thông tin.

9

Tạo tệp đối tượng bằng gcc, sau đó sử dụng ar để nhóm chúng vào thư viện tĩnh.

50

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

makefile

TARGET = prog 

$(TARGET): main.o lib.a 
    gcc $^ -o [email protected] 

main.o: main.c 
    gcc -c $< -o [email protected] 

lib.a: lib1.o lib2.o 
    ar rcs [email protected] $^ 

lib1.o: lib1.c lib1.h 
    gcc -c -o [email protected] $< 

lib2.o: lib2.c lib2.h 
    gcc -c -o [email protected] $< 

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

giải thích makefile:

  • target: prerequisites - người đứng đầu cai trị
  • [email protected] - có nghĩa là mục tiêu
  • .210
  • $^ - có nghĩa là tất cả các điều kiện tiên quyết
  • $< - có nghĩa là chỉ những điều kiện tiên quyết đầu tiên
  • ar - một công cụ Linux để tạo, chỉnh sửa, và trích xuất từ ​​kho lưu trữ see the man pages for further information. Các tùy chọn trong trường hợp này có nghĩa là:
    • r - thay thế các file đang tồn tại bên trong các kho lưu trữ
    • c - tạo ra một kho lưu trữ nếu không đã tồn tại
    • s - tạo ra một chỉ số đối tượng tập tin vào kho lưu trữ

Để kết thúc: Thư viện tĩnh trong Linux không có gì khác ngoài lưu trữ tệp đối tượng.

main.csử dụng lib

#include <stdio.h> 

#include "lib.h" 

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

lib.hlibs tiêu đề chính

#ifndef LIB_H_INCLUDED 
#define LIB_H_INCLUDED 

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

#endif 

lib1.cnguồn lib đầu tiên

#include "lib1.h" 

#include <stdio.h> 

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

lib1.htiê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.cnguồn lib thứ hai

#include "lib2.h" 

#include <stdio.h> 

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

lib2.htiê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 */ 
+1

Cảm ơn bạn đã giải thích. –

+4

câu trả lời hay nhất là những câu trả lời phù hợp nhất với ví dụ, công việc tuyệt vời :) – Youda008

+0

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, 'ar' cần giải thích, vì nó là chìa khóa để tạo thư viện tĩnh. – Joost

Các vấn đề liên quan