我必须为学校项目构建一个库,并在一个小应用程序中使用该库。现在,我已经制作了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
答案 0 :(得分:5)
您需要确保gcc可以“查看”所有必需的头文件以确保正确编译。为此,您应该在构建时将lib
目录包含在路径中:
gcc -I ./lib -c XPM_lib.c test.c
gcc -o program XPM_lib.o test.o
注意:
“未定义引用...”表示即使您包含头文件,但您也没有告诉编译器链接库。这些不是“未宣布的”,它们是“未定义的”。这就是它找不到符号的原因。