2013-11-30 2 views
2

Я написал файл кода c, называемый «utilfunc.c», этот код содержит мои функции, которые я буду использовать через свой код.undefined ссылка на основную проблему

Теперь, когда я компилирую файл "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 
+0

Отлично, но можете ли вы объяснить это больше для меня? –

+1

@arzeramade: Да: когда вы компилируете свой файл «utilfunc.c», вам нужно добавить флаг командной строки '-c' в свою командную строку компилятора. –

+0

большое спасибо, что мне не хватает –

2

В зависимости от параметров, предоставляемых компилятором (вы не показывали, поэтому я не могу сказать конкретно о вас), компилятор/компоновщик попытается построить целую аппликацию и в этом случае он будет определяться в основном. Но вы можете предоставить различные варианты, чтобы сказать, чтобы просто скомпилировать указанный файл и остановиться там, что похоже на то, что вы хотите.

+0

Вот что я действительно хочу :) –

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 
+1

Я думаю, вы упустили из виду, что на самом деле пошло не так ... '-I -c' означает рассматривать' -c' как путь включения. –

+0

@ M.M Спасибо, что заявили об этом. Я подозревал это, но пути (почти?) Всегда указывались сразу после '-I', как в [руководстве gcc'] (https://gcc.gnu.org/onlinedocs/gcc/Directory-Options .html), без какого-либо промежутка между пробелами. Но на странице 'man gcc' пространство действительно кажется допустимым. Во всяком случае, это может быть довольно неожиданным. Надеюсь, этот ответ, с вашим комментарием, поможет другим понять это быстрее. – ederag

Смежные вопросы