2010-12-23 188 views
2

我的主目錄中有以下目錄。未定義對函數的引用

  1. 包括

在源目錄中,我有以下文件:

a.c

#include <stdio.h> 
#include "a.h" 

extern void function(void); 

int main() 
{ 

    printf("PREDEFINED = %d\n",PREDEFINED); 
    function(); 
    return 0; 
} 

b.c

#include <stdio.h> 
void function() 
{ 
    printf("Hello from function\n"); 
} 

a.h

#define PREDEFINED 100 

我編譯b.c和移動B.0至lib文件夾。

然後我從source

gcc -Wall -o temp a.c -I../include -L../Lib 

試過以下命令,但它顯示以下錯誤 a.c: undefined reference to function``

但是,當我使用下面的命令時,它產生的輸出文件而不temp任何錯誤

gcc -Wall -o temp a.c -I../include ../Lib/b.o 

我在哪裏出錯了?

+0

你應該在頭文件中真正地定義`function()`,例如「b.h」並將其包含在「a.c」中。無論如何,你究竟在做什麼?建立「b.c」作爲圖書館?你的製作系統非常不標準。對於快速命令行構建而言,通常將所有C文件同時編譯到可執行文件中,而不用打擾目標文件。對於正確的make系統,將所有C文件編譯成目標文件並將它們鏈接到可執行文件中更爲常見。你有一個混合在這裏。 – AlastairG 2010-12-23 14:58:07

回答

0

在第一個命令中,您只需將Lib定義爲查找庫的位置。但是,您不指定任何庫鏈接,並且無論如何,庫路徑不用於查找目標文件。

在第二個命令中,您明確指定了要用作鏈接器輸入的對象文件。

因此,使用第一個命令找不到功能function(),並找到第二個命令。

5

目標文件不是庫。試試這個來創建和使用一個簡單的靜態庫:

ar rcs ../Lib/libb.a b.o 
gcc -Wall -o temp a.c -I../include -L../Lib -lb 

靜態庫通常包含多個對象。您可以將完整的對象列表添加到ar行。請注意,選項-l{name}會導致鏈接程序找到名爲lib{name}.a的文件。