我必須建立一個學校項目的圖書館,並在一個小應用程序中使用該圖書館。現在,我已經制作了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);
}
}
的test1.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
你的實際目錄結構是什麼?這些頭文件和源文件位於何處? – Mike 2013-02-28 16:55:50