0

私はこのcプログラムを持っています:

#include    <sys/types.h>
#include    "ourhdr.h"

int     glob = 6;       /* external variable in initialized data */
char    buf[] = "a write to stdout\n";

int
main(void)
{
    int     var;        /* automatic variable on the stack */
    pid_t   pid;

    var = 88;
    if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1)
        err_sys("write error");
    printf("before fork\n");    /* we don't flush stdout */

    if ( (pid = fork()) < 0)
        err_sys("fork error");
    else if (pid == 0) {        /* child */
        glob++;                 /* modify variables */
        var++;
    } else
        sleep(2);               /* parent */

    printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
    exit(0);
}

ヘッダーファイル「ourhdr.h」(同じフォルダーにあります)で、err_sys()などのいくつかの関数を定義しました。gcc でコンパイル中に次のエラーが発生します。

In function "main":
undefined reference to "err_sys"

どうすればこれを機能させることができますか? 必要に応じて、ヘッダー ファイルをここに投稿できます。ありがとうございました。

** 編集: ** これは ourhdr.h ファイルです: http://pastebin.com/fMUiG4zU

4

3 に答える 3

0

の宣言を含むヘッダー ファイルをインクルードしましたerr_sys。リンカーに渡される実装もある必要があります。バックグラウンド:

コンパイラは、モジュールをオブジェクト ファイルにコンパイルし ますg++ -c modul1.cmodul1.o g++ -c modul2.cmodul2.o

各モジュールは、インクルードされたヘッダー ファイルで定義されている関数を参照できます。ここまでは、その関数を実際に実装する必要はありません。

次のステップでは、リンカーはすべてのオブジェクト ファイル (およびライブラリ) をリンクし ますg++ modul1.o modul2.o./a.out

2 番目のステップでは、使用されるすべての関数の実装が必要です。あなたがそれを提供したことを確認してください!

(PS: 一部のコンパイラでは、1 つのコマンドでコンパイルとリンクを実行できます。複数のモジュールがある場合は、それらを単一の gcc 呼び出しに追加できます。ただし、make を使用することをお勧めします)

于 2013-06-25T11:11:15.300 に答える
-1

私としては、関数名を正しく書けば問題なくコンパイル、動作しています。

于 2013-06-25T10:08:03.217 に答える