Я пытаюсь скомпилировать код по следующей ссылке, чтобы распечатать трассировку, когда генерируется сигнал:#define не распространяющихся в заголовочном файле C
http://www.linuxjournal.com/article/6391?page=0,1 (из статьи http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/063/6391/6391l3.html)
я сделал необходимые изменения (REG_EIP -> REG_RIP). Я также изменил «#include <ucontext.h>
» на «#include <sys/ucontext.h>
», чтобы отладить мою проблему, которую я объясню ниже.
В верхней части файла выглядит следующим образом:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <execinfo.h>
/* get REG_EIP from ucontext.h */
#define __USE_GNU
#include <sys/ucontext.h>
...
С кодом, как есть, я получаю следующее сообщение об ошибке:
# gcc ./st2.c -rdynamic -o st2
./st2.c: In function ‘bt_sighandler’:
./st2.c:22: error: ‘REG_RIP’ undeclared (first use in this function)
./st2.c:22: error: (Each undeclared identifier is reported only once
./st2.c:22: error: for each function it appears in.)
Однако, когда я скопировать строку «#define __USE_GNU "на вершине„/usr/include/sys/ucontext.h“(который я знаю, это очень плохая идея, и носит лишь временный характер) следующим образом:
#ifndef _SYS_UCONTEXT_H
#define _SYS_UCONTEXT_H 1
#define __USE_GNU
#include <features.h>
#include <signal.h>
#include <bits/wordsize.h>
............
#endif // _SYS_UCONTEXT_H
Моя программа скомпилирована и работает правильно.
Я сбив с толку, почему #define в моей программе не «течет» в заголовочный файл «sys/ucontext.h», а добавляет #define непосредственно в sys/ucontext.h, имеет значение. Любая помощь была бы очень оценена. J
Спасибо, Ahmed.
__USE_GNU - внутренний макрос glibc, который не должен определяться непосредственно вашим приложением. –
@jwodder Не могли бы вы описать, что вы редактировали, чтобы исправить строку "#include" в моем исходном сообщении. Спасибо. –
@AhmedA: Я просто поместил строки внутри backticks (\ '), чтобы включить форматирование кода и предотвратить использование SO для обработки заголовков как HTML-тегов. – jwodder