c - 如何解决 "undefined reference to function"错误?

标签 c gcc undefined-reference

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

我的文件是(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

最佳答案

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

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

注意:

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

关于c - 如何解决 "undefined reference to function"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15141122/

相关文章:

c - 单链表C,打印

c++ - 可以在 g++ 4.7+ 中重新启用 `uint` 类型吗?

c++ - 使用文件的 undefined reference

c - 将字符串输入二维数组

c - 结构到二进制

objective-c - 在 uint8_t * 和 char * 之间转换。会发生什么?

c++ - 当 `delete` 使用非虚析构函数处理基类时,Clang 和 GCC 会做什么?

c - 棘手的指针别名问题

c - 如何在编译时链接Libb64库?

c++ - 为什么模板只能在头文件中实现?