2012-02-14 2 views
0

현재 컴퓨터 엔지니어링 시니어 프로젝트의 최종 개발 및 테스트 단계에 있습니다. libs (Libjpeg, Libbmp, PocketSphinx, Libavcodec, Libavcodec, Libavformat, Libavutil)로 코드 (C, Bash)를 디자인하고 개발 한 후 netbeans를 IDE로 사용합니다. 내가 가진 문제는 Netbeans에서 코드가 컴파일되고 링크가 완벽하게 이루어 지므로 소프트웨어의 실행도 문제가되지 않는다는 것입니다. 그러나, 나는 외부 메이크 파일을 사용하여 컴파일하고 코드를 연결할 때, 같은 기능 : fopen, fread, fwrite, fgets, fscanf, 등등 ... 작동이 중지C 함수 (fgets, scanf, fread, fwrite, fopen)로 알 수없는 동작

GCC-플래그 :

-m32 -O3 -W -Wall -std=gnu99 -pedantic -Wbad-function-cast -Wcast-align -Wcast-qual \ 
-Wchar-subscripts -Winline -Wmissing-prototypes -Wnested-externs -Wpointer-arith \ 
-Wredundant-decls -Wshadow -Wstrict-prototypes -Wwrite-strings -Wformat-nonliteral \ 
-Wformat-security -ftrapv -lrt -Wno-unused \ 
-DMODELDIR=\"`pkg-config --variable=modeldir pocketsphinx`\" \ 
`pkg-config --cflags --libs pocketsphinx sphinxbase` \ 
`pkg-config --cflags --libs sndfile` 

LD-플래그 :

-I/usr/local/lib -I/usr/local/include -I/usr/local/lib/pkgconfig -lpthread \ 
-lpocketsphinx -lsndfile -ljpeg -lavformat -lavcodec -ldl -lasound -lz -lswscale \ 
-lavutil -lm 

같은 알 수없는 행동도 perfor에 영향을 미치는 이제 HMM을 열 수없는 PocketSphinx의 무언가.

내 마지막 발표가 다음 주이므로 어떤 계발이라도 정말 기뻐합니다.

---------- UPDATE ----------

이 내 실제 MakeFile을

.SUFFIXES: .o .c 
.c.o: $(CC) -c $(CFLAGS) $< 

# Compiler and Flags 
CC = gcc 
CFLAGS = -m32 -O3 -W -Wall -std=gnu99 -pedantic -Wbad-function-cast -Wcast-align -Wcast-qual -Wchar-subscripts -Winline -Wmissing-prototypes -Wnested-externs -Wpointer-arith -Wredundant-decls -Wshadow -Wstrict-prototypes -Wwrite-strings -Wformat-nonliteral -Wformat-security -ftrapv -Wno-unused -DMODELDIR=\"`pkg-config --variable=modeldir pocketsphinx`\"`pkg-config --cflags --libs pocketsphinx sphinxbase` `pkg-config --cflags --libs sndfile` 

# Libraries 
LIBS = -I/usr/local/lib -I/usr/local/include -I/usr/local/lib/pkgconfig -lpocketsphinx -lsndfile -ljpeg -lavformat -lavcodec -ldl -lasound -lz -lswscale -lavutil -lm 

# Source files 
SRC= libbmp.c state.c secure.c audio.c config.c engine.c helpers.c macmp2.c queue.c image.c video.c 

# Object Files 
OBJ= libbmp.o state.o secure.o audio.o config.o engine.o helpers.o macmp2.o queue.o image.o video.o 

# Executable file 
EXECUTABLE = macmp2 

# Explicit rule 
hist: $(OBJ) 
    $(CC) $(CFLAGS) -o $(EXECUTABLE) $(OBJ) $(LIBS) 

clean: 
    rm -f *.o 
    rm -f $(EXECUTABLE) 

# Implicit rules 
audio.o: macmp2.h libbmp.h audio.c 
config.o: macmp2.h libbmp.h config.c 
engine.o: macmp2.h libbmp.h engine.c 
helpers.o: macmp2.h libbmp.h helpers.c 
image.o: macmp2.h libbmp.h image.c 
libbmp.o: libbmp.h libbmp.c 
macmp2.o: macmp2.h libbmp.h macmp2.c 
queue.o: macmp2.h libbmp.h queue.c 
secure.o: macmp2.h libbmp.h secure.c 
state.o: macmp2.h libbmp.h state.c 
video.o: macmp2.h libbmp.h video.c 

컴파일 타임 오류입니다 : 없음 런타임 오류 : 없음

먼저 코드의이 부분에서 문제를 확인합니다.

void load_configuration (macmp2_state * s) 
{ 
    register uint32_t it = 0x0;      /* Iterator */ 
    register uint32_t size = get_file_size (s);  /* Configuration File Size */ 
    char * new_entry = (char *) malloc_safe (sizeof (char) * LINE_LENGTH * 5, s); 
    char * error_msg = (char *) malloc_safe (sizeof (char) * LINE_LENGTH * 5, s); 
    char * filename = NULL;       /* Filename Token */ 
    char * pmode = NULL;       /* Processing Mode Token */ 
    char * token = NULL;       /* String Token */ 
    FILE * fp = NULL;        /* File Pointer */ 

    /* Temporary Variables */ 
    video_file * v = (video_file *) malloc_safe (sizeof(*v), s); 
    image_file * i = (image_file *) malloc_safe (sizeof(*i), s); 
    audio_file * a = (audio_file *) malloc_safe (sizeof(*a), s); 

#ifdef DEBUG 
    fprintf (stderr, "Reading configuration file.\n"); 
#endif 

    fp = fopen_safe (s->config_file, "r", s); 

    for (it = size; it > 0x0; it--) 
    { 
     /* Initializing Variables */ 
     memset (new_entry, '\0', LINE_LENGTH * 5); 
     init_video_file (v); 
     init_image_file (i); 
     init_audio_file (a); 

     /* Extracting entry from configuration file */   
     if (fgets (new_entry, (LINE_LENGTH * 5 * sizeof(char)), fp) == NULL) 
     { 
      fatal_error (s, "Error reading configuration file."); 
     } 

MakeFile로 컴파일 할 때 항상 "오류 읽기 구성 파일"이 표시되지만 Netbeans에서는 표시되지 않습니다.

프로그램 입력 : ./macmp2 -c configuration.txt 출력 : 구성 파일을 읽는 중입니다.

[*] 치명적인 오류 : 구성 파일을 읽는 동안 오류가 발생했습니다.

내가 말했듯이, 코드는 내 수석 프로젝트를위한 것이며 여기에 게시 할 수 없습니다. 나는이 문제가 Linker Flags와 관련이 있다고 확신한다. 프로그램은 첫 번째 반복에서 멈 춥니 다. 앞에서 Netbeans와 함께 컴파일 할 때 코드가 작동하지만 게시 된 MakeFile을 사용하여 컴파일 할 때 작동을 멈 춥니 다. 조나단 Leffler의 요청에 따라

---------- UPDATE ----------

, 여기 fopen_safe 및 malloc_safe에 대한 래퍼입니다.

둘 모두에 의해 구현되는 fopen_safe 및 malloc_safe 코드.

void * malloc_safe (size_t size, macmp2_state * s) 
{ 
    void * ptr = malloc (size); 

    if (ptr == NULL) 
    { 
     fatal_error (s, "Memory could not be allocated."); 
    } 
    return ptr; 
} 

FILE * fopen_safe (const char * filename, const char * mode, macmp2_state * s) 
{ 
    FILE * stream = fopen (filename, mode); 

    if (stream == NULL) 
    { 
     fatal_error (s, "Stream could not be open."); 
    } 
    return stream; 
} 
+2

"작동하지 않음"? –

+1

일주일 정도면 충분하지 않을 수 있습니다. Make 아래의 건물이 프로젝트의 목표라면, 처음부터 다시 작성해야합니다. – Beta

+3

"작업 중지"는 우리가 도와 줄 수있는 것이 아닙니다. 컴파일 타임에 오류가 있으면 게시하십시오. 런타임 크래시가 발생하면 설명하십시오. 출력이 예상 한 것과 다르면 입력을 자세히 설명하십시오. 몇 가지 코드를 게시하십시오. – abelenky

답변

2

귀하의 링크 플래그 ("ld-flags"귀하의 질문에) 잘못된 순서입니다.

링커 (ld, 종종 gcc을 통해 호출되는)에 대한 프로그램 인수 순서는 중요합니다. 먼저 소스 파일 (gcc)을 넣은 다음 오브젝트 파일 (종속성 순서대로)을 배치 한 다음 라이브러리 (상위 레벨 시스템에서 하위 레벨 시스템으로)를 배치해야합니다. 예를 들어, -lpthread-lavformat

뒤에 배치해야하지만 실제로는 Makefile -s를 작성하는 법을 배워야합니다. 시간이 충분한 지 모르겠습니다. 좋은 연습은 프로젝트 시작시에 Makefile을 시작하고 코드를 향상시킬 때 향상시키는 것입니다.

+0

필자의 게시물을 MakeFile의 소스 코드로 업데이트합니다. –

0

귀하의 코드는 두 상황 (링커가 만족되는 경우 포함)에서 정상적으로 컴파일됩니다.

그런 다음 make를 사용하여 빌드했을 때 두 가지 상황 모두에서 실행하면 후자에서 예기치 않은 결과가 발생합니다.

내게는 응용 프로그램을 실행하는 환경을 확인하지 않는 것이 좋습니다. fgets에 대한 문서에는 오류가있을 때뿐만 아니라 EOF가 발생할 때 바이트가 읽히지 않은 경우에도 NULL이 반환된다는 내용이 명확하게 나와 있습니다.

정말로 어떤 파일이 열려 있는지 알고 싶다면 strace를 사용하고 적절한 환경에서 적절한 환경 설정 파일을 사용하여 응용 프로그램을 실행하십시오. 나는 이것이 당신이 문제를 발견하게 할 것이라고 확신한다.