Bạn xem ở đây: http://www.adp-gmbh.ch/cpp/gcc/create_lib.html
Ai pro chỉ giúp mình cách tự tạo thư viện trong ubuntu được không? Để có thể gọi thư viện đó giống như thư viện stdio.h ấy.
Bạn xem ở đây: http://www.adp-gmbh.ch/cpp/gcc/create_lib.html
bạn phải viết một thư viện thì mới tạo thư viện được
mình làm thí dụ cho bạn xem: mình viết một file .c để tạo thư viện cho nó
sau đó biên dịchC Code:
char *version(){ return "libchung version 1.0"; }
gcc -c lib.c -fPIC
gcc -shared lib.o -o libchung.so
cp -v libchung.so /lib
đến bước này coi thư là xong
chỉ cần khai báo file .h như sau:
C Code:
extern char *version();
RISC better than CISC
phamthechung0@gmail.com
Mình làm theo như hương dẫn.
Tạo 1 file .c (libtoan.c)
C Code:
int sqr(n) { return n*n; }
Sau đó mình biên dịch theo đúng trình tự, nhưng đến bước cuối
thì lại báo lỗiCode:cp -v libtoan.so /lib
Chỉ giúp mình với.Code:`libtoan.so' -> `/lib/libtoan.so' cp: cannot create regular file `/lib/libtoan.so': Permission denied
tại bạn ở user bình thường nên không có quyền tạo thư viện.Bạn phải là super user mới được.
Bạn nên dùng lệnh su hoặc sudo để lên quyền
RISC better than CISC
phamthechung0@gmail.com
Trong hệ thống UNIX (hay tựa UNIX) nói chung cho phép chúng ta tạo và sử dụng hai loại thư viện: thư viện tĩnh và thư viện dùng chung(static libraries and shared (or dynamic) libraries).
Tạo một thư viện tĩnh sử dụng "ar" và "ranlib"
Công cụ cơ bản để tạo một thư viện tĩnh là ar, sử dụng như sau:
Câu lệnh trên tạo ra thư viện libutil, cờ c báo cho ar biết là tạo một thư viện libutil mới nếu nó chưa tồn tại, cờ r báo cho ar biết thay thế những file đối tượng (.o) cũ bằng file đối tượng mới, sau đó ta sử dụng lệnh:Code:ar rc libutil.a file1.o file2.o file3.o
Lệnh này dùng để tạo hay update chỉ số.Code:ranlib libutil.a
Sử dụng thư viện tĩnh
Code:cc main.o -L. -lutil -o prog
Tạo thư viện liên kết động sử dụng "ld"
Nhìn là bạn hiểu rồi chứ, các cờ thì thôi thứ lỗi cho mình ko giải thích thêm.Code:cc -fPIC -c file1.c cc -fPIC -c file2.c cc -fPIC -c file3.c cc -shared libutil.so file1.o file2.o file3.o
Sử dụng thư viện động
Code:cc main.o -L. -lutil -o prog
That's it.
Regards.
Đã được chỉnh sửa lần cuối bởi meterpreter : 30-09-2011 lúc 01:43 PM.
We are oft to blame in this...'Tis too much proved.
- That with devotion's visage and pious action we do sugar o'er the devil himself.
Có 3 loại thư viện trên C là thư viện liên kết tĩnh,thư viện liên kết động và thư viện liên kết muộn
Thư viện liên kết tĩnh :
Để tạo thư viện liên kết tĩnh trong C.Ta cẩn hiểu cơ chế biên dịch của gcc.gcc đầu tiên sẽ tạo ra 1 file chứa mã máy,đó là file .o(giống .obj trên VC).Sau đó,gcc tiếp tục thực hiện quá trình linking để tạo ra file binary để có thế thực thi.
Mô hình :
Bình thường gcc thực hiên 2 quá trình và sinh ra luôn mã máy.Vì thế,ta giới hạn gcc cho nó biên dịch ra .o, nhắm lợi dụng các hàm trong liên kết tĩnh.
Ví dụ :
Tạo file a.c và b.c
file a.c có nội dung :
C Code:
#include <stdio.h> void sodt(int dt){ }
file b.c có nội dung :
Sau đó tiến hành biên dịch,tạo ra 2 file a.o và b.o :C Code:
#include <stdio.h> void ten(char *t){ }
Tạo ra 1 file thuvien.h để import 2 hàm ten và sodt vào:C Code:
gcc -c a.c b.c
C Code:
touch lib.h vi lib.h
gõ nội dung như sau :
Sau đó viết 1 file nhapthongtin.c :C Code:
void sodt(int); void ten(char *);
C Code:
#include "thuvien.h" int main(){ sodt(3); ten("lttq"); return 0; }
Biên dịch file nhapthongtin.c:
gcc -c nhapthongtin.c
Nó tạo ra file nhapthongtin.o
Để biên dịch ra file binary ta gõ :
gcc a.o b.o nhapthongtin.o -o filenhiphan
C Code:
./filenhiphan so dien thoai la 3 ten la lttq
Để xem các hàm được biên dịch từ file .Ta có thể dùng lệnh nm :
….C Code:
7/Thư viện liên kết động
Nhược điễm của thư viện liên kết tĩnh là gcc phải nhúng mã nhị phân vào chương trình chính khi chạy.Vì thế,nhiều nhiều khi phải gọi hàm rất nhiều lần gây tốn kém không gian bộ nhớ.
Thư viện liên kết động đáp ứng được vấn đề trên.Thư viện liên kết động khi đựoc gọi từ chương trình nào đó,nó được nạp lên bộ nhớ.Ở vùng nhớ chia sẻ,các ứng dụng khác nhau có thể gọi các hàm từ thư viện liên kết động để thực thi.Khi cần thay đổi 1 hàm trong thư viện,chỉ cần biên dịch lại là xong.Trên windows,đó là các file .dl,còn trên linux là .so
Khi biên dịch,yêu cầu phải thêm option -fpic vào để định vị vùng nhớ mà thư viện liên kết động này được đưa lên.
Ví dụ :
tạo file calc_mean.c
tạo file calc_mean.h:C Code:
double mean(double a, double b) { return (a+b) / 2; }
Tiếp tục tạo ra .oC Code:
double mean(double, double); tạo file main.c: #include <stdio.h> #include "calc_mean.h" int main(int argc, char* argv[]) { double v1, v2, m; v1 = 5.2; v2 = 7.9; m = mean(v1, v2); return 0; }
gcc -c -fPIC calc_mean.c -o calc_mean.h
tạo ra file .so(như .dll trên windows)
gcc -shared calc_mean.o calc_mean.h -o libmean.so
tiếp tục biên dịch ra file main:
gcc -o main main.c -lmean -L/home/dll
option -l để giúp gcc tìm kiếm file .so để tạo ra 1 đường dẫn tham chiếu đến /home/dll
option -L để xác định file .so trong thư mục /home/dll
nhưng nó sẽ báo lỗi không thấy file libmean .so được nạp vào bộ nhớ.Vì sao?
Đơn giản là biến môi trường không trỏ vào vị trí chứa file libmean .so.
error while loading shared libraries: libmean.so: cannot open shared object file: No such file or directory
Để kiểm tra ta gõ :
ta thấy libmean.so chưa được nạp vào bộ nhớ.Ta cần thay đổi lại biến mội trường để nhận được libmean.so.C Code:
ldd main linux-gate.so => (0x004a5000) libmean.so => not found libc.so => /lib/i686/nosegneg/libc.so (0x00a9a000)
Đầu tiên,xem biến môi trường có các đường dẫn nào:
lttq$echo $PATH
….
// se khong thay duong dan thu muc hien tai
Ta chỉnh biến môi trường bằng cách :
export LD_LIBRARY_PATH=/home/dll
để trỏ đến đường dẫn cụ thể,hoặc tại thư mục thì có thể :
export LD_LIBRARY_PATH=.
Biên dịch lại lần nữa :
gcc -o main main.c -lmean -L/home/dll
Kiểm tra :
Thực thi :C Code:
ldd main linux-gate.so => (0x007e7000) libmean.so => /home/qua/libmean.so (0x00132000) libc.so => /lib/i686/nosegneg/libc.so (0x00a9a000) /lib/ld-linux.so (0x00a77000)
[root@lttq dll1]# ./main
The mean of 5.20 and 7.90 is 6.55
Thư viện liên kết muộn :
Chưa viết xong,cái này dễ các bạn google nhé do lười viết quá
Nghe Metal và dịch thơ
lttqstudy.wordpress.com
bạn viết đi viết lại chi vậy
RISC better than CISC
phamthechung0@gmail.com
cam on ban lttq nhieu lam!