C语言 如何解决“未定义的函数引用”错误?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/15141122/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to solve "undefined reference to function" error?
提问by user1550876
I have to build a library for a school project and use that library in a small aplication. Now, I have made the XPM_lib.h and XPM_lib.c files and also my test.c file. But when I try to compile my test.c file I get an "undefined reference to initXPM_image" error.
我必须为学校项目构建一个库,并在一个小应用程序中使用该库。现在,我已经制作了 XPM_lib.h 和 XPM_lib.c 文件以及我的 test.c 文件。但是当我尝试编译我的 test.c 文件时,我收到了“对 initXPM_image 的未定义引用”错误。
My files are (XPM_lib.h):
我的文件是(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
and (XPM_lib.c) :
和 (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);
}
}
The test.c file is :
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;
}
Now, I can't use and IDE to set up a project for this so I have to compile it manually using gcc. To compile, I did:
现在,我无法使用 IDE 来为此设置项目,因此我必须使用 gcc 手动编译它。为了编译,我做了:
gcc -c .\lib\XPM_lib.c
gcc -c test.c
gcc -o program .\lib\XPM_lib.o test.o
( I forgot to mention !) My directory structure :
(我忘了提!)我的目录结构:
.\lib\XPM_lib.h
.\lib\XPM_lib.c
.\test.c
回答by Mike
You need to make sure gcc can "see" all the required header files to ensure proper compilation. In order to do this you should include the libdirectory into your path when building:
您需要确保 gcc 可以“看到”所有必需的头文件以确保正确编译。为此,您应该lib在构建时将该目录包含在您的路径中:
gcc -I ./lib -c XPM_lib.c test.c
gcc -o program XPM_lib.o test.o
Note:
笔记:
"undefined reference to..." means even though you included the header file, but you don't tell the compiler to link with the library. These aren't "undeclared", they're "undefined". That's why it doesn't find symbols.
“对...的未定义引用”意味着即使您包含了头文件,但您没有告诉编译器与库链接。这些不是“未声明”,而是“未定义”。这就是它找不到符号的原因。

