2010-12-23 117 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的文件。