我编写了一个名为“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");
}
}
答案 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