Что означает «неопределенная ссылка на varName» в C?

У меня есть 2 файла: ac и bc

В ac я посылаю сигнал функции, расположенной в bc

 signal(SIGUSR1,doSomething); 

В верхней части файла ac у меня есть:

 extern void doSomething (int sig); 

Однако при компиляции я получаю сообщение об ошибке:

/tmp/ccCw9Yun.o: В функции main':
ac:(.text+0xba): undefined reference to
main':
ac:(.text+0xba): undefined reference to
main':
ac:(.text+0xba): undefined reference to
doSomething ‘
collect2: ld возвращен 1 статус выхода

Включены следующие заголовки:

 #include  #include  #include  #include  #include  #include  

Как это исправить?

    Вам нужно связать оба ao и bo :

     gcc -o program ac bc 

    Если у вас есть main() в каждом файле, вы не можете связать их вместе.

    Однако ваш файл ac содержит ссылку на doSomething() и ожидает, что он будет связан с исходным файлом, который определяет doSomething() и не определяет какую-либо функцию, определенную в ac (например, main() ).

    Вы не можете вызвать функцию в процессе B из процесса A. Вы не можете отправить сигнал функции; вы отправляете сигналы процессам, используя системный вызов kill() .

    Функция signal() указывает, какая функция в вашем текущем процессе (программе) будет обрабатывать сигнал, когда ваш процесс получает сигнал.

    У вас есть серьезная работа, чтобы понять, как это будет работать – как ProgramA узнает, к какому идентификатору процесса нужно отправить сигнал. Код в bc должен будет вызывать signal() с dosomething как обработчик сигнала. Код в ac просто посылает сигнал другому процессу.

    Очень плохое определение внешних интерфейсов в файлах .c. ,

    Вы должны это сделать

    ах

      extern void doSomething (int sig); 

    переменный ток

      void doSomething (int sig) { ... do stuff } 

    До нашей эры

     #include "ah" ..... signal(SIGNAL, doSomething); 

    ,

    Первоначальная реакция на это заключалась бы в том, чтобы спросить и убедиться, что два объектных файла связаны друг с другом. Это делается на этапе компиляции, скомпилировав оба файла одновременно:

     gcc -o programName ac bc 

    Или, если вы хотите компилировать отдельно, это будет:

     gcc -c ac gcc -c bc gcc -o programName ao bo 

    Вы получаете ошибку компоновщика, поэтому ваш extern работает (компилятор скомпилировал ac без проблем), но когда он пошел связывать объектные файлы вместе в конце, он не смог разрешить ваш extern- void doSomething(int); на самом деле ничего не найдено. Вы испортили экстерн? Убедитесь, что на самом деле есть doSomething определенный в bc который принимает int и возвращает void , и убедитесь, что вы запомнили, чтобы включить bc в свой список файлов (т.е. вы делаете что-то вроде gcc ac bc , а не только gcc ac )

    Вам необходимо скомпилировать, а затем связать файлы объектов следующим образом:

     gcc -c ac gcc -c bc gcc ao bo -o prog 

    убедитесь, что ваша функция doSomething не является статичной.