У меня есть 2 файла: ac
и bc
В ac
я посылаю сигнал функции, расположенной в bc
signal(SIGUSR1,doSomething);
В верхней части файла ac у меня есть:
extern void doSomething (int sig);
Однако при компиляции я получаю сообщение об ошибке:
/tmp/ccCw9Yun.o: В функции
main':
ac:(.text+0xba): undefined reference tomain':
ac:(.text+0xba): undefined reference tomain':
doSomething ‘
ac:(.text+0xba): undefined reference to
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 не является статичной.