未定义的主要问题参考

时间:2013-11-30 12:34:38

标签: c unix

我编写了一个名为“utilfunc.c”的c代码文件,这段代码包含了我将通过代码使用的函数。

现在,当我编译我的“utilfunc.c”文件时,发生了一个错误,告诉我对'main'错误消息的未定义引用。但是在这段代码中,我不想要main。我想要的只是我的功能的实现。

谁能告诉我这里发生了什么?

这是我的代码:

include "prodcon.h"

static void signalHandler(int signo)
{
    signalflag = 1; // Set the signal flag
}

void initializeWait(void)
{
    /* Link handler functions */
    if (signal(SIGUSR1, signalHandler) == SIG_ERR)
    {
        perror("signal");
        exit(EXIT_FAILURE);
    }
    if (signal(SIGUSR2, signalHandler) == SIG_ERR)
    {
        perror("signal");
        exit(EXIT_FAILURE);
    }

    /* Clear masks */
    sigemptyset(&nomask);
    sigemptyset(&newmask);

    /* Add signals to mask sets */
    sigaddset(&newmask, SIGUSR1);
    sigaddset(&newmask, SIGUSR2);

    /* Block SIGUSR1 and SIGUSR2, and save current signal mask. */
    if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
    {
        perror("sigprocmask");
        exit(EXIT_FAILURE);
    }
}

void signalParent(pid_t pid)
{
    kill(pid, SIGUSR2); // Child tells parent that it is done
}   

void waitParent(void)
{
    while (signalflag == 0)
    {
        sigsuspend(&nomask);    // Wait for signal from parent
    }

    signalflag = 0; // Clear the singalflag

    /* Restore the signal mask to old value */
    if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
    {
        perror("sigprocmask");

    }
}

3 个答案:

答案 0 :(得分:9)

-c添加到您的编译器调用中,以便您只编译翻译单元,但不链接到完整的程序:

gcc -c -o foo.o foo.c

答案 1 :(得分:2)

根据您为编译器提供的选项(您没有显示任何选项,因此我不能具体说明您的选项),编译器/链接器将尝试构建整个应用程序,在这种情况下,它将需要主要定义。但是你可以提供不同的选项来告诉它只是编译给定的文件,并停在那里,这听起来像你想要的。

答案 2 :(得分:0)

这不是原始海报的问题,但这是导致相同错误消息的一个不寻常原因:缺少路径的选项。

gcc -I../include -O -I. -g -O2 -DNDEBUG -O3 -fPIC -I -c graph.c -o graph.o
/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../lib64/crt1.o: In function `_start':
/home/abuild/rpmbuild/BUILD/glibc-2.19/csu/../sysdeps/x86_64/start.S:118: undefined reference to `main'
collect2: error: ld returned 1 exit status

请注意-I之前的虚假-c graph.c。没有它,它编译得很好

gcc -I../include -O -I. -g -O2 -DNDEBUG -O3 -fPIC -c graph.c -o graph.o

问题是路径丢失(-I<path>)。 将cwd添加为路径(-I.)可以正常工作

gcc -I../include -O -I. -g -O2 -DNDEBUG -O3 -fPIC -I. -c graph.c -o graph.o

任何命令之后的任何丢失路径都可能产生此错误;例如-L

gcc -I../include -O -I. -g -O2 -DNDEBUG -O3 -fPIC -L -c graph.c -o graph.o
/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../lib64/crt1.o: In function `_start':
/home/abuild/rpmbuild/BUILD/glibc-2.19/csu/../sysdeps/x86_64/start.S:118: undefined reference to `main'
collect2: error: ld returned 1 exit status