8.25.2018

"undefined reference to" 問題解決方法

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


原文網址:https://read01.com/GAQBKx.html

沒有留言:

張貼留言