2013-02-17 66 views
8

Tôi đã tạo một thư viện với các tệp pila.hpila.c. Tôi biên soạn tập tin pila.c với gcc pila.c -c và thư viện này hoạt động tốt. Tôi đã thử nghiệm nó.Làm cách nào để biên dịch thư viện trên C bằng GCC?

Sau đó, tôi đã tạo một thư viện khác. Thư viện này có các tệp pila_funciones_extra.hpila_funciones_extra.c. Trong thư viện này tôi cần bao gồm thư viện đầu tiên. Trong tập tin pila_funciones_extra.h tôi đặt dòng tiếp theo bao gồm nó:

#include "pila.h" 

và trong file pila_funciones_extra.c tôi đặt dòng tiếp theo:

#include "pila_funciones_extra.h" 

vì nó có được.

Nhưng khi tôi cố gắng biên dịch tệp pila_funciones_extra.c trình biên dịch không nhận ra sự bao gồm của thư viện pila. Nó nói rằng các hàm, cấu trúc, hằng số và các macro được định nghĩa trong thư viện pila chưa được xác định.

Tôi đã cố gắng biên dịch với gcc pila_funciones_extra.c -cgcc pila_funciones_extra.c -c pila.o nhưng nó không hoạt động.

Tôi đảm bảo rằng tất cả các tệp đều nằm trong cùng một thư mục.

Tôi đang làm việc trên Ubuntu.

Bất kỳ ai có thể cho tôi biết đúng cách để biên dịch không?

+2

Vui lòng đăng lỗi trình biên dịch _exact_ bạn nhận được (biên dịch dòng + 5-10 dòng đầu ra đầu tiên). – Mat

+0

Bạn đã sử dụng cờ '-l pila.o' khi bạn đang biên dịch' pila_funciones_extra.c'? –

+0

Bạn có đang sử dụng bất kỳ nhân viên bảo vệ nào không? '# ifndef's'? Ví dụ: nếu bạn sử dụng giống nhau trong cả hai tiêu đề thì chỉ có '_extra.h' sẽ bị xóa. –

Trả lời

1

Đối với một thư viện gồm nhiều tác phẩm đầu tiên mà bạn có thể biên dịch sau đó riêng biệt và sau đó làm điều này:

ar ruv mylib.a pila_funciones_extra.o pila.o 
ranlib mylib.a 

Lệnh này gây ra thư viện để được tạo ra nếu nó không tồn tại. Nếu có, các tệp .o được cập nhật (hoặc được thêm vào thư viện này). ranlib được sử dụng để phân ngẫu nhiên thư viện theo cách hữu ích cho trình tải.

Khi bạn sử dụng thư viện này, bạn cần làm:

gcc -o myapp myapp.c mylib.a 
18

Thứ nhất, luôn luôn có thói quen để biên dịch với -Wall (và có lẽ thậm chí cũng-Wextra để có được thậm chí nhiều hơn cảnh báo) tùy chọn để gcc; nó cung cấp cho bạn gần như tất cả các cảnh báo, và bạn nên cải thiện mã của bạn cho đến khi không có cảnh báo được đưa ra.

Sau đó, bạn thường muốn có thể gỡ lỗi mã của mình, vì vậy, cũng có thể vượt qua -g đến gcc. Khi bạn tự tin với mã của mình, bạn có thể yêu cầu gcc để tạo mã máy được tối ưu hóa với -O2. Tìm hiểu cách sử dụng trình gỡ lỗi gdb.

Vì vậy, hãy biên dịch thư viện đầu tiên của bạn, giả sử các tệp nguồn của nó first1.cfirst2.c nằm trong thư mục FirstLib/, ví dụ:

cd FirstLib/ 
gcc -Wall -g -c first1.c -o first1.o 
gcc -Wall -g -c first2.c -o first2.o 

Tại thời điểm này, bạn nên sử dụng một Makefile và học cách sử dụng make, đặc biệt bởi vì bạn muốn để có được bạn libfirst.a với

ar ruv libfirst.a first1.o first2.o 
ranlib libfirst.a 

Sau đó, bạn có thể vượt qua -L../FirstLib -lfirst như các tùy chọn cuối cùng để lệnh gcc biên dịch và liên kết chương trình của bạn bằng cách sử dụng libfirst.a

Sau đó, biên dịch thư viện thứ hai bằng cách có Makefile trong thư mục SecondLib/ mà rất có lẽ nên chứa

# in SecondLib/Makefile 
CC=gcc 
CFLAGS= -I../FirstLib/ -Wall -g 
## add your other stuff for make 

vv vv Bạn thực sự muốn học cách sử dụng make và viết riêng Makefile -s nên mất thời gian của bạn để đọc GNU make documentation.

Bạn có thể muốn vượt qua -H-gcc để có nó cho bạn biết tất cả các file bao gồm, và bạn có thể muốn sử dụng remake (ngoài & thay thế make) để gỡ lỗi phức tạp hơn Makefile -s của bạn (đặc biệt bằng cách chạy remake -x). Here là ví dụ về Makefile; bạn sẽ tìm thấy nhiều người khác!

Đọc thêm số Program Library Howto.

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