0

私は現在、コンピューター工学の上級プロジェクトの最終的な開発とテストの段階にあります。libs (Libjpeg、Libbmp、PocketSphinx、Libavcodec、Libavformat、Libavutil) を使用してコード (C、Bash) の設計と開発を行い、IDE として netbeans を使用した後。私が抱えている問題は、Netbeans ではコードが完全にコンパイルおよびリンクされ、ソフトウェアの実行も問題ないことです。ただし、MakeFile を使用して外部でコードをコンパイルおよびリンクすると、、、、、、などの関数が機能しなくなりfopenます...freadfwritefgetsfscanf

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;
}
4

2 に答える 2

2

リンク フラグ (質問の「ld-flags」) の順序が間違っています。

リンカーへのプログラム引数の順序 ( ld、しばしば を通じて呼び出されるgcc) は非常に重要です。最初にソース ファイル ( 用gcc)、次にオブジェクト ファイル (依存関係の順)、次にライブラリ (高レベルのものから低レベルのシステムのものへ) を配置する必要があります。たとえば、あなた-lpthreadは後に配置する必要があります-lavformat

Makefileしかし、本当に-sの書き方を学ぶべきです。あなたに十分な時間があるかどうかわかりません。プロジェクトの開始時に開始Makefileし、(コードを改善するにつれて) 改善することをお勧めします。

于 2012-02-14T17:16:55.360 に答える
0

コードは両方の状況で問題なくコンパイルされます (リンカーが満たされていることを含む)。

次に、両方の状況で実行し、後者で make を使用してビルドすると、予期しない結果が得られます。

私には、これはアプリケーションを実行する環境をチェックしていないように見えます。fgets のドキュメントには、エラーが発生した場合だけでなく、EOF が検出されたときにバイトが読み取られなかった場合にも NULL が返されることが明確に記載されています。

どのファイルが開いているかを本当に知りたい場合は、strace を使用し、適切な構成ファイルを適切な場所に配置して、想定される環境でアプリケーションを実行するようにしてください。これで問題が見つかると確信しています。

于 2012-02-21T16:53:17.007 に答える