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쪽을 보시고
다른 곳(?)도 확인을 좀 해보시는게 어떨까 싶습니다.
댓글 달기