【问题标题】:Undefined Reference to function未定义的函数引用
【发布时间】:2010-12-23 14:51:20
【问题描述】:

我的主目录中有以下目录。

  1. 来源

  2. 包括

在源目录中我有以下文件:

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.o 移动到 Lib 文件夹。

然后我从source文件夹尝试了以下命令

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

但它显示以下错误 a.c: undefined reference tofunction``

但是当我使用以下命令时,它会生成输出文件temp 而没有任何错误

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

我哪里错了?

【问题讨论】:

  • 你真的应该在头文件中定义function(),例如“b.h”并将其包含在“a.c”中。不管怎样,你到底想做什么?将“b.c”构建为库?您的制造系统非常不标准。对于快速的命令行构建,更常见的做法是将所有 C 文件同时编译成可执行文件,而不用打扰目标文件。对于正确的 make 系统,通常将所有 C 文件编译成目标文件,然后将它们链接到可执行文件中。你有一个混合在这里。

标签: c compiler-construction linker linker-errors


【解决方案1】:

目标文件不是库。试试这个来创建和使用一个简单的静态库:

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

一个静态库通常包含多个对象。您可以将完整的对象列表添加到ar 行。请注意,选项 -l{name} 会导致链接器查找名为 lib{name}.a 的文件。

【讨论】:

    【解决方案2】:

    在第一个命令中,您只需将 Lib 定义为查找库的地方。但是,您没有指定要链接的任何库,而且库路径也不用于查找目标文件。

    在第二个命令中,您明确指定要用作链接器输入的目标文件。

    因此,第一个命令找不到函数function(),而第二个命令找到了。

    【讨论】:

      猜你喜欢
      • 2013-12-29
      • 2015-12-06
      • 2019-09-05
      • 2011-09-19
      • 2017-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多