在此,只舉個靜態庫的例子,假設源碼如下。
先把test.c編譯成靜態庫(.a)文件
- gcc -c test.c
- ar -rc test.a test.o
至此,我們得到了test.a文件。我們開始編譯main.c
- gcc -c main.c
這時,則生成了main.o文件,然後我們再通過如下命令進行連結希望得到可執行程序。
你會發現,編譯器報錯了:
- /tmp/ccCPA13l.o: In function `main':
- main.c:(.text+0x7): undefined reference to `test'
- collect2: ld returned 1 exit status
其根本原因也是找不到test函數的實現文件,由於該test函數的實現在test.a這個靜態庫中的,故在連結的時候需要在其後加入test.a這個庫,連結命令修改為如下形式即可。
- gcc -o main main.o ./test.a //註:./ 是給出了test.a的路徑
【擴展】:同樣,為了把問題說清楚,上面我們把代碼的編譯連結分開了,如果希望一次性生成可執行程序,則可以對main.c和test.a執行如下命令。
- gcc -o main main.c ./test.a //同樣,如果不加test.a也會報錯
原文網址:https://read01.com/GAQBKx.html
沒有留言:
張貼留言