作者 主題: library如何使用  (閱讀 8651 次)

0 會員 與 1 訪客 正在閱讀本文。

Ives

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
library如何使用
« 於: 2007-03-12 02:37 »
各位先進!請問一下
現在開發各種不同類型專業的程式時,有些都有現成的library可以使用,以我的情形來說,需要開發sip的程式,必須用到eXosip,與osip的library,來寫程式
在./configure
與 make之後,library裡面的範例程式就能執行,
但是對於自己寫的程式卻不知道如何使用gcc來自己編譯程式,因為看不懂makefile所以不知道該怎麼辦,有人可以告訴我該怎麼做嗎

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
library如何使用
« 回覆 #1 於: 2007-03-12 03:19 »
1.先在您的家目錄123下建立一個子目錄456

2.在456下再建立一些以功能取名的子目錄,如net或file

3.將函數(不含main()的函數)建立在net,file這些子目錄下aaa.c,bbb.c.....

4.在456下面的net,file子目錄下各建立一個go.sh內容如下
代碼: [選擇]

rm *.o
rm *.a
rm /home/123/456/libxxx.a
make
cp *.a /home/123/456

rm /home/123/456/libxxx.a的xxx最好取成與目錄名相同

5.在456下面的net,file子目錄下各建立一個檔名為makefile內容範例如下
代碼: [選擇]

LIB=libxxx.a

$(LIB):\
$(LIB)(aaa.o)\
$(LIB)(bbb.o)

aaa.o:aaa.c
########gcc -c aaa.c
bbb.o:bbb.c
########gcc -c bbb.c

########是一個Tab請拿掉後按TAB鍵可輸入一個Tab
aaa.c及bbb.c就是在該子目錄下的各.c檔
例如net下有aaa.c,bbb.c則net下的makefile只要有aaa.c,bbb.c的內容即可
而file下有ddd.c.eee.c同樣只要有ddd.c,eee.c內容,不可把aa.c,bbb.c,ddd.c,eee.c
通通寫在一個makefile裡面(要指定路徑所以不是好辨法)

5.執行./go.sh後應該可以在/home/123/456下有一個libxxx.a的檔案

6.在你常寫程式的那個目錄123下也建立一個go.sh內容如下
代碼: [選擇]

rm *.o
rm go
make
gdb go

最後一行gdb go也可以直接go就可以了

7.在你常寫程式的那個目錄123下也建立一個makefile內容如下
代碼: [選擇]

go:yyy.o
########gcc -L/home/123/456 -D_REENTRANT -g -o yyy yyy.c -lxxx

yyy.c內必須有main()函數

請注意最後一個-lxxx就是剛才建立的libxxx.a因為gcc是這種規則libxxx.c
要在命令列成為參數需-L/home/123/456這個參數然後會去該目錄下找*.a及
檔名前三字為lib的檔案
-D_REENTRANT<---這個是幹嘛的我忘了><"

簡單說您函數庫編出來的檔案名稱前三字一定要是lib而後面必須是.a
而傳給gcc做參數時需指定路徑且將檔名簡寫成-lxxx即可(l是L的小寫)


8.開一個iii.h檔宣告各函數的原型,在yyy.c內#include "/home/123/iii.h"

9.您就可以在yyy.c叫用aaa.c及bbb.c裡面的函數了

10.編譯時在123下執行go.sh即可

11.在不同子目錄下的各函數在您個別執行go.sh時它會個別將舊的換成新的

12.每多一個.c檔(多一組函數)就要在makefile內去增加它

就醬了,這是我目前函數庫的管理辦法,每次都是切換到net,file目錄下執行go.sh
而依功能取名的子目錄管理起來較方便(KDE下的終端機可開多個shell不用跑來砲去 :wink: )
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
library如何使用
« 回覆 #2 於: 2007-03-12 15:50 »
更正:
7.在你常寫程式的那個目錄123下也建立一個makefile內容如下
go:yyy.o
########gcc -L/home/123/456 -D_REENTRANT -g -o go yyy.c -lxxx
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

Ives

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
library如何使用
« 回覆 #3 於: 2007-03-13 20:12 »
請問第8點
iii.h檔要怎麼建

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
library如何使用
« 回覆 #4 於: 2007-03-14 00:24 »
引述: "Ives"
請問第8點
iii.h檔要怎麼建


http://phorum.study-area.org/viewtopic.php?p=220962#220962
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

Ives

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
library如何使用
« 回覆 #5 於: 2007-03-14 02:49 »
如果我下載的library裡面也有  .h檔呢?....這些  .h又必須放在哪裡呢?

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
library如何使用
« 回覆 #6 於: 2007-03-14 04:07 »
隨便...指得到就可以了....不然跟iii.h放同一目錄吧
還是多開一個目錄專門放這些.h檔的....需要時就include進來
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

Ives

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
library如何使用
« 回覆 #7 於: 2007-03-14 13:22 »
我在家目錄
/home/123/456/ 建兩個資料夾 osip2與osipparser2
將src中的osip2與osipparser中的 .c檔分別複製到自己建的osip2與osipparser2中
(我下載的檔案目錄有列在這邊http://www.gnu.org/software/osip/doc/html/dirs.html)
(另外我有問題的是在src/osip2/  下有fsm.h, xixt.h 一樣 跟 include下的放在一起嗎)

並且在osip2與osipparser中各建立一個go.sh
 rm *.o
 rm *.a
 rm /home/123/456/libosip.a
 make
 cp *.a /home/123/456
 
接下來在456下面的osip2與osipparser2中建立Makefile

在osip2的Makefile為

LIB=libosip.a
$(LIB):\
$(LIB):(fsm_misc.o) \
$(LIB):(ict.o)
  .
  .
  .
$(LIB):(port_thread.o)

fsm_misc.o:fsm_misc.c
########gcc -c fsm_misc.c
ict.o:ict.c
########gcc -c ict.c
  .
  .
  .
port_thread.o:port_thread.c
########gcc -c port_thread.c


在osipparser2的Makefile中為
LIB=libosip.a
$(LIB):\
$(LIB)(osip_content_encoding.c)\
$(LIB)(osip_proxy_authorization.o)\
  .
  .
  .
$(LIB)(osip_proxy_authenticate.o)  \
$(LIB)(osip_authentication_info.o) \
$(LIB)(osip_proxy_authentication_info.o)

之後分別執行./go.sh
出現
rm: 無法移除 ‘*.o’: 沒有此一檔案或目錄
rm: 無法移除 ‘*.a’: 沒有此一檔案或目錄
rm: 無法移除 ‘/home/123/456/libosip.a’: 沒有此一檔案或目錄
Makefile:10: *** missing separator.  Stop.
cp: 無法 stat ‘*.a’: 沒有此一檔案或目錄

...應該要做怎麼樣的修改呢?

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
library如何使用
« 回覆 #8 於: 2007-03-14 14:06 »
引述: "Ives"
我在家目錄
/home/123/456/ 建兩個資料夾 osip2與osipparser2
將src中的osip2與osipparser中的 .c檔分別複製到自己建的osip2與osipparser2中
(我下載的檔案目錄有列在這邊http://www.gnu.org/software/osip/doc/html/dirs.html)
(另外我有問題的是在src/osip2/  下有fsm.h, xixt.h 一樣 跟 include下的放在一起嗎)

並且在osip2與osipparser中各建立一個go.sh
 rm *.o
 rm *.a
 rm /home/123/456/libosip.a
 make
 cp *.a /home/123/456
 
接下來在456下面的osip2與osipparser2中建立Makefile

在osip2的Makefile為

LIB=libosip.a
$(LIB):\
$(LIB):(fsm_misc.o) \
$(LIB):(ict.o)\
  ..................\
  ..................\
  ..................\
$(LIB):(port_thread.o)-------->最後一列不用\號

fsm_misc.o:fsm_misc.c
########gcc -c fsm_misc.c----->說過#號全刪掉換成Tab
ict.o:ict.c
########gcc -c ict.c
  .
  .
  .
port_thread.o:port_thread.c
########gcc -c port_thread.c


在osipparser2的Makefile中為
LIB=libosip.a
$(LIB):\--------------------------------------->
$(LIB)(osip_content_encoding.c)\---------->
$(LIB)(osip_proxy_authorization.o)\------->
  ..............................----------------------->
  .............................------------------------>
  .
$(LIB)(osip_proxy_authenticate.o)  \
$(LIB)(osip_authentication_info.o) \
$(LIB)(osip_proxy_authentication_info.o)-------->最後一列不用\號

osip_proxy_authenticate.o:osip_proxy_authenticate.c---->本檔也需有對應
########gcc -c osip_proxy_authenticate.c------------->

之後分別執行./go.sh
出現
rm: 無法移除 ‘*.o’: 沒有此一檔案或目錄
rm: 無法移除 ‘*.a’: 沒有此一檔案或目錄
rm: 無法移除 ‘/home/123/456/libosip.a’: 沒有此一檔案或目錄
Makefile:10: *** missing separator.  Stop.
cp: 無法 stat ‘*.a’: 沒有此一檔案或目錄

...應該要做怎麼樣的修改呢?
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
library如何使用
« 回覆 #9 於: 2007-03-14 14:13 »
還有:
接下來在456下面的osip2與osipparser2中建立Makefile

應該是:makefile就可以了

這兩個的意義很像不一樣....我還要看一下書,不過印象中書上有說其意義不同
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
library如何使用
« 回覆 #10 於: 2007-03-14 14:17 »
之後分別執行./go.sh
出現
rm: 無法移除 ‘*.o’: 沒有此一檔案或目錄
rm: 無法移除 ‘*.a’: 沒有此一檔案或目錄
rm: 無法移除 ‘/home/123/456/libosip.a’: 沒有此一檔案或目錄
Makefile:10: *** missing separator. Stop.這個才是真正錯誤所在
cp: 無法 stat ‘*.a’: 沒有此一檔案或目錄

其他的訊息在編譯成功一次以後就不會再出現了
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
library如何使用
« 回覆 #11 於: 2007-03-14 14:28 »
$(LIB)(osip_content_encoding.c)\
$(LIB)(osip_proxy_authorization.o)\
$(LIB)(osip_proxy_authenticate.o) \
$(LIB)(osip_authentication_info.o) \
$(LIB)(osip_proxy_authentication_info.o)

這些很像是網路功能的函數庫唷:D 在哪裡下載的阿...可以報一下嗎(英文的就不必了)

謝謝,3Q,感恩
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

Ives

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
library如何使用
« 回覆 #12 於: 2007-03-14 15:01 »
都改了~~
還是出現
makefile:10: *** missing separator.  Stop.
的錯誤訊息 :
cry:

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
library如何使用
« 回覆 #13 於: 2007-03-14 15:03 »
那檢查一下第10行有沒有拼錯字或少(多)了\號
不然就是第10行對應的那個地方拼錯字
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼