【问题标题】:How to solve "undefined reference to function" error?如何解决“未定义的函数引用”错误?
【发布时间】:2013-02-14 23:22:10
【问题描述】:

我必须为学校项目构建一个库,并在一个小型应用程序中使用该库。现在,我制作了 XPM_lib.h 和 XPM_lib.c 文件以及我的 test.c 文件。但是当我尝试编译我的 test.c 文件时,我得到一个“未定义的 initXPM_image 引用”错误。

我的文件是 (XPM_lib.h):

#ifndef LIBRARYXPM_H_INCLUDED
#define LIBRARYXPM_H_INCLUDED



#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define HEADER "/*XPM*/"
#define STRING_BEGIN "static char *egc[] = {\n\n /*width ,  height , ncolors ,        charsperpixel */ \n "
#define STRING_END "\n }"
#define STRING_SEPARATOR ","
#define STRING_COLORS "/* colors #RRGGBB */"
#define STRING_PIXELS "/* pixels */"


struct Color{

        unsigned char r,g,b;
        char *color_char;
        char key[2];
};   


struct XPM_image {

        unsigned int width;
        unsigned int height;
        unsigned int no_colors; // number of colors used

        unsigned char char_per_pixel; // number of characters to describe a pixel

        struct Color *color_table; // table containing the colors
        unsigned int **image_data; // contains indices from color_table

} ;


// functions first problem , lab 1

extern void initXPM_image (struct XPM_image *image, unsigned int width, unsigned int      height, unsigned char char_per_pixel, unsigned int no_colors );

extern void freeXPM_image (struct XPM_image *image);

extern void setXPMpixel (struct XPM_image *image, unsigned int poz_x, unsigned int poz_y, unsigned int index );

extern void setXPMcolor (struct XPM_image *image, unsigned int index, unsigned char r, unsigned char g, unsigned char b, char *pattern);

extern void writeToFile (struct XPM_image *image , char *pathname);



#endif // LIBRARYXPM_H_INCLUDED

和(XPM_lib.c):

    #include "XPM_lib.h"

// initializeaza spatiul pentru imagine si tabela de culori si seteaza proprietatiile de baza
void initXPM_image (struct XPM_image *image, unsigned int width, unsigned int height, unsigned char char_per_pixel, unsigned int no_colors )
{
    image->width = width;
    image->height = height;
    image->char_per_pixel = char_per_pixel;
    image->no_colors = no_colors;

    if ( ( image->color_table =(struct Color*) malloc ( image->no_colors * sizeof(struct Color)) == NULL ))
        {
            printf("Eroare in initXPM_image la alocarea color_table");
            exit (0);

        }



    if ( ( image->image_data = (unsigned int **) malloc (height * sizeof(unsigned int *))) == NULL )
    {

        printf("Eroare in initXPM_image la alocarea image_data (height)");
        exit (0);

    }

    int i;
    for (  i = 0 ; i < height ; i++ )
    {
        if ( (image->image_data[i] = (unsigned int *) malloc (width * sizeof (unsigned int ))) == NULL )
        {
            printf( "Eroare in initXPM_image la alocarea image_data (width)");
            exit (0);
        }

    }



}


void setXPMcolor (struct XPM_image *image, unsigned int index, unsigned char r, unsigned char g, unsigned char b, char *pattern)
{

    image->color_table[index].r = r;
    image->color_table[index].g = g;
    image->color_table[index].b = b;

    image->color_table[index].color_char = pattern;

}

void setXPMpixel (struct XPM_image *image, unsigned int poz_x, unsigned int poz_y, unsigned int index )
{

    image->image_data[poz_x][poz_y] = index; // pun index-ul culorii din tabela de culori din imagine

}

void writeToFile (struct XPM_image *image , char *pathname)
{

    FILE *f;

    if (( f = fopen(pathname,"wt")) == NULL)
    {
        printf("Eroare la deschiderea fisierului!");
        exit(0);

    }

    fprintf( f ,"%s\n%s",  HEADER , STRING_BEGIN);

    fprintf( f , "\" %d %d %d %d\"", image->width, image->height , image->no_colors , image->char_per_pixel);

    // colors
    fprintf( f, "%s \n" , STRING_COLORS);
    int i;
    for ( i = 0 ; i < image->no_colors ; i++ )
        {
            printf("\"%s c #%.02X%.02X%.02X\",\n" , image->color_table[i].color_char , image->color_table[i].r , image->color_table[i].g , image->color_table[i].b);
        }


}

test.c 文件是:

#include "lib/XPM_lib.h"


#define WIDTH 50
#define HEIGHT 50
#define COLORS 50


int main ()
{

    char first_char = 'a';
    struct XPM_image *image;

    if ((image = (struct XPM_image*) malloc (sizeof(struct XPM_image))) == NULL )
    {
        printf("Eroare la alocarea XPM_image\n");
        exit(0);

    }

    initXPM_image (image, WIDTH, HEIGHT,1, COLORS);

    int i,j;
    for (  i = 0 ; i < COLORS; i++ )
    {
        setXPMcolor(image, i, 255*i/(COLORS-1),0,0,&first_char);
        first_char++;
    }

    for ( i = 0 ; i < WIDTH ; i++ )
        for ( j = 0 ; j < HEIGHT ; j++ )
            setXPMpixel(image,i,j,i);

    writeToFile(image,"imagine.xpm");
    return 0;

}

现在,我不能使用 IDE 来为此设置项目,所以我必须使用 gcc 手动编译它。为了编译,我做了:

gcc -c .\lib\XPM_lib.c
gcc -c test.c
gcc -o program .\lib\XPM_lib.o test.o 

(我忘了说!)我的目录结构:

.\lib\XPM_lib.h 
.\lib\XPM_lib.c
.\test.c

【问题讨论】:

  • 您的实际目录结构是什么?这些头文件和源文件在哪里?

标签: c gcc undefined-reference


【解决方案1】:

您需要确保 gcc 可以“看到”所有必需的头文件以确保正确编译。为此,您应该在构建时将lib 目录包含到您的路径中:

gcc -I ./lib -c XPM_lib.c test.c
gcc -o program XPM_lib.o test.o

注意:

“未定义的对...的引用”意味着即使您包含了头文件,但您没有告诉编译器与库链接。这些不是“未声明的”,而是“未定义的”。这就是它找不到符号的原因。

【讨论】:

  • 这是我的错,我已经编辑了帖子,所以它现在是准确的。我的主文件夹中有一个 lib 文件夹,其中有两个 XPM_lib.h 和 XPM_lib.c 文件。我觉得奇怪的是 XPM_lib 中定义的结构没有问题,只有函数。
  • @user1550876 - 感谢您提供该信息,检查更新和说明,这是否回答了您的问题?
猜你喜欢
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 2020-12-11
  • 2014-04-16
  • 2014-10-07
  • 2019-04-13
  • 2017-06-27
  • 2013-06-05
相关资源
最近更新 更多