libjpeg 사용시 컴파일 오류에 대해서 질문합니다.
글쓴이: yserzero / 작성시간: 월, 2009/09/28 - 3:57오후
libjpeg 사용 관련하여서 jpegsrc.v7.tar.gz를 구한 후, 그 안에 포함되어 있는 example.c를 컴파일하려는데 에러가 납니다.
다음이 example.c 의 내용으로 주석을 모두 제거하고 main 문만 추가했습니다.
jpeglib.h, jconfig.h, jmorecfg.h는 /usr/include/ 에 위치해 있고,
libjpeg.la, libjpeg.so, libjpeg.a가 /usr/lib 에 위치해 있습니다.
컴파일 명령은 gcc -o ex example.c -ljpeg 을 사용했습니다.
그런데 image_width, image_height, image_buffer, put_scanline_someplace 이 4개가 undefined reference to 'xxx' 라는 오류가 납니다. (xxx는 앞에 4개입니다.)
이 오류가 왜 나는 건가요?
어떻게 해결해야 하나요?
그리고 3개의 함수의 반환형을 괄호로 감싸고 있는 GLOBAL, METHODDEF은 무슨 의미인가요?
전문가분들의 많은 답변 부탁드립니다.
#include <stdio.h> #include "jpeglib.h" #include <setjmp.h> extern JSAMPLE * image_buffer; /* Points to large array of R,G,B-order data */ extern int image_height; /* Number of rows in image */ extern int image_width; /* Number of columns in image */ GLOBAL(void) write_JPEG_file (char * filename, int quality) { struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; FILE * outfile; /* target file */ JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */ int row_stride; /* physical row width in image buffer */ cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); if ((outfile = fopen(filename, "wb")) == NULL) { fprintf(stderr, "can't open %s\n", filename); exit(1); } jpeg_stdio_dest(&cinfo, outfile); cinfo.image_width = image_width; /* image width and height, in pixels */ cinfo.image_height = image_height; cinfo.input_components = 3; /* # of color components per pixel */ cinfo.in_color_space = JCS_RGB; /* colorspace of input image */ jpeg_set_defaults(&cinfo); jpeg_set_quality(&cinfo, quality, TRUE /* limit to baseline-JPEG values */); jpeg_start_compress(&cinfo, TRUE); row_stride = image_width * 3; /* JSAMPLEs per row in image_buffer */ while (cinfo.next_scanline < cinfo.image_height) { row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride]; (void) jpeg_write_scanlines(&cinfo, row_pointer, 1); } jpeg_finish_compress(&cinfo); fclose(outfile); jpeg_destroy_compress(&cinfo); } struct my_error_mgr { struct jpeg_error_mgr pub; /* "public" fields */ jmp_buf setjmp_buffer; /* for return to caller */ }; typedef struct my_error_mgr * my_error_ptr; METHODDEF(void) my_error_exit (j_common_ptr cinfo) { my_error_ptr myerr = (my_error_ptr) cinfo->err; (*cinfo->err->output_message) (cinfo); longjmp(myerr->setjmp_buffer, 1); } GLOBAL(int) read_JPEG_file (char * filename) { struct jpeg_decompress_struct cinfo; struct my_error_mgr jerr; /* More stuff */ FILE * infile; /* source file */ JSAMPARRAY buffer; /* Output row buffer */ int row_stride; /* physical row width in output buffer */ if ((infile = fopen(filename, "rb")) == NULL) { fprintf(stderr, "can't open %s\n", filename); return 0; } cinfo.err = jpeg_std_error(&jerr.pub); jerr.pub.error_exit = my_error_exit; if (setjmp(jerr.setjmp_buffer)) { jpeg_destroy_decompress(&cinfo); fclose(infile); return 0; } jpeg_create_decompress(&cinfo); jpeg_stdio_src(&cinfo, infile); (void) jpeg_read_header(&cinfo, TRUE); (void) jpeg_start_decompress(&cinfo); row_stride = cinfo.output_width * cinfo.output_components; buffer = (*cinfo.mem->alloc_sarray) ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); while (cinfo.output_scanline < cinfo.output_height) { (void) jpeg_read_scanlines(&cinfo, buffer, 1); put_scanline_someplace(buffer[0], row_stride); } (void) jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); fclose(infile); return 1; } int main(void) { return 0; }
Forums:
직접 컴파일은 안해봤지만
말씀하신 질문을 보니 아마 컴파일은 되었고 링킹 과정에서 에러가 난 듯 한 것 같은데요.
에러가 난다고 말씀하시는 4가지 심볼들을 보니
extern int형 변수 3개하고 함수명 하나 이렇더군요.
외부 다른 파일(라이브러리)에서 extern int변수가 정의되고 함수가 정의 되었을 텐데 그것을 못찾는 것 같습니다.
gcc -o ex example.c -ljpeg 을 실행하신 후 에러중에 혹시 library못찾는다는 에러 없었나요?
아니면 컴파일 할 때 옵션들이 다르다던지 해서 제대로 안 될 수 있으니 library makefile쪽을 보시고
다른 곳(?)도 확인을 좀 해보시는게 어떨까 싶습니다.
댓글 달기