私は現在、コンピューター工学の上級プロジェクトの最終的な開発とテストの段階にあります。libs (Libjpeg、Libbmp、PocketSphinx、Libavcodec、Libavformat、Libavutil) を使用してコード (C、Bash) の設計と開発を行い、IDE として netbeans を使用した後。私が抱えている問題は、Netbeans ではコードが完全にコンパイルおよびリンクされ、ソフトウェアの実行も問題ないことです。ただし、MakeFile を使用して外部でコードをコンパイルおよびリンクすると、、、、、、などの関数が機能しなくなりfopen
ます...fread
fwrite
fgets
fscanf
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
同じ未知の動作が、HMM を開くことができない PocketSphinx のパフォーマンスにも影響を与えています。
私の最終プレゼンテーションは来週なので、どんな啓発も本当に感謝しています。
- - - - - アップデート - - - - -
これは私の実際の 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 出力: 構成ファイルの読み取り。
[*] 致命的なエラー: 構成ファイルの読み取り中にエラーが発生しました。
私が言ったように、コードは私の上級プロジェクト用であり、ここに投稿することはできません. 問題はリンカーフラグに関係していると確信しています。プログラムは最初の反復で停止します。前に述べたように、コードは Netbeans でコンパイルすると機能しますが、投稿された MakeFile を使用してコンパイルすると機能しなくなります。
- - - - - アップデート - - - - -
Jonathan Leffler のリクエストにより、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;
}