Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: Tạo thư viện cho C trong ubuntu như thế nào?

  1. #1
    Ngày gia nhập
    09 2011
    Bài viết
    6

    Mặc định Tạo thư viện cho C trong ubuntu như thế nào?

    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.

  2. #2
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Bạn xem ở đây: http://www.adp-gmbh.ch/cpp/gcc/create_lib.html

  3. #3
    Ngày gia nhập
    09 2011
    Bài viết
    84

    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ó
    C Code:
    1. char *version(){
    2.   return "libchung version 1.0";
    3. }
    sau đó biên dịch
    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:
    1. extern char *version();
    RISC better than CISC
    phamthechung0@gmail.com

  4. #4
    Ngày gia nhập
    09 2011
    Bài viết
    6

    Mình làm theo như hương dẫn.
    Tạo 1 file .c (libtoan.c)
    C Code:
    1. int sqr(n)
    2. {
    3. return n*n;
    4. }

    Sau đó mình biên dịch theo đúng trình tự, nhưng đến bước cuối
    Code:
    cp -v libtoan.so /lib
    thì lại báo lỗi
    Code:
    `libtoan.so' -> `/lib/libtoan.so'
    cp: cannot create regular file `/lib/libtoan.so': Permission denied
    Chỉ giúp mình với.

  5. #5
    Ngày gia nhập
    09 2011
    Bài viết
    84

    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

  6. #6
    Ngày gia nhập
    08 2011
    Nơi ở
    /pentest
    Bài viết
    44

    Mặc định Tạo thư viện cho C trong ubuntu như thế nào?

    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:

    Code:
    ar rc libutil.a file1.o file2.o file3.o
    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:
    ranlib libutil.a
    Lệnh này dùng để tạo hay update chỉ số.

    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"


    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
    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.


    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.

  7. #7
    Ngày gia nhập
    08 2011
    Bài viết
    98

    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:
    1. #include <stdio.h>
    2.  
    3. void sodt(int dt){
    4.     printf("so dien thoai la %d \n",dt);     
    5. }

    file b.c có nội dung :
    C Code:
    1. #include <stdio.h>
    2.  
    3. void ten(char *t){
    4.     printf("ten la %s \n",t);    
    5. }
    Sau đó tiến hành biên dịch,tạo ra 2 file a.o và b.o :
    C Code:
    1. gcc -c a.c b.c
    Tạo ra 1 file thuvien.h để import 2 hàm ten và sodt vào:
    C Code:
    1. touch lib.h
    2. vi lib.h

    gõ nội dung như sau :
    C Code:
    1. void sodt(int);
    2. void ten(char *);
    Sau đó viết 1 file nhapthongtin.c :
    C Code:
    1. #include "thuvien.h"
    2.  
    3. int main(){
    4.     sodt(3);
    5.     ten("lttq");     
    6.     return 0;
    7. }

    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:
    1. ./filenhiphan
    2. so dien thoai la 3
    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:
    1. lttq$nm a.o
    2.                  U printf
    3. 00000000 T sodt
    4.  
    5. lttq$nm b.o
    6.                 U printf
    7. 00000000 T ten
    8.  
    9. nm nhapthongtin.o
    10. 00000000 T main
    11.          U sodt
    12.          U ten
    ….

    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
    C Code:
    1. double mean(double a, double b)
    2. {
    3. return (a+b) / 2;
    4. }
    tạo file calc_mean.h:
    C Code:
    1. double mean(double, double);
    2.  
    3. tạo file main.c:
    4. #include <stdio.h>
    5. #include "calc_mean.h"
    6.  
    7. int main(int argc, char* argv[]) {
    8.  
    9. double v1, v2, m;
    10. v1 = 5.2;
    11. v2 = 7.9;
    12.  
    13. m  = mean(v1, v2);
    14.  
    15. printf("The mean of %3.2f and %3.2f is %3.2f\n", v1, v2, m);
    16.  
    17. return 0;
    18. }
    Tiếp tục tạo ra .o

    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õ :
    C Code:
    1. ldd main
    2.         linux-gate.so =>  (0x004a5000)
    3.         libmean.so => not found
    4.         libc.so => /lib/i686/nosegneg/libc.so (0x00a9a000)
    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.
    Đầ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 :

    C Code:
    1. ldd main
    2.         linux-gate.so =>  (0x007e7000)
    3.         libmean.so => /home/qua/libmean.so (0x00132000)
    4.         libc.so => /lib/i686/nosegneg/libc.so (0x00a9a000)
    5.         /lib/ld-linux.so (0x00a77000)
    Thực thi :

    [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

  8. #8
    Ngày gia nhập
    09 2011
    Bài viết
    84

    bạn viết đi viết lại chi vậy
    RISC better than CISC
    phamthechung0@gmail.com

  9. #9
    Ngày gia nhập
    02 2014
    Bài viết
    1

    cam on ban lttq nhieu lam!

Các đề tài tương tự

  1. Ghi file giữa hai máy tính w7 và ubuntu, như thế nào ?
    Gửi bởi kinhkhafortoday trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 1
    Bài viết cuối: 19-01-2013, 06:48 PM
  2. Làm thế nào để add g++ đế lập trình c trên ubuntu?
    Gửi bởi khanhbkhn_92 trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 4
    Bài viết cuối: 20-12-2012, 03:39 PM
  3. Cách sử dụng wpa_supplicant trong ubuntu như thế nào?
    Gửi bởi haian trong diễn đàn Thắc mắc lập trình shell Linux
    Trả lời: 3
    Bài viết cuối: 26-04-2011, 03:07 PM
  4. Sử dụng GCC trên Ubuntu như thế nào?
    Gửi bởi qhai_2009 trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 5
    Bài viết cuối: 09-03-2011, 07:03 AM
  5. Thắc mắc về lập trình trên ubuntu 10.10
    Gửi bởi rocktea trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 14
    Bài viết cuối: 01-12-2010, 07:31 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn