Фон
Я пытаюсь создать образец приложения REST api для Rasbian, работающего на Raspberry 3. Я использовал cpprestsdk
.
Пример содержит следующий заголовочный файл:
#include <condition_variable>
#include <mutex>
#include <iostream>
static std::condition_variable _condition;
static std::mutex _mutex;
namespace cfx {
class InterruptHandler {
public:
static void hookSIGINT() {
signal(SIGINT, handleUserInterrupt);
}
static void handleUserInterrupt(int signal){
if (signal == SIGINT) {
std::cout << "SIGINT trapped ..." << '\n';
_condition.notify_one();
}
}
static void waitForUserInterrupt() {
std::unique_lock<std::mutex> lock { _mutex };
_condition.wait(lock);
std::cout << "user has signaled to interrup program..." << '\n';
lock.unlock();
}
};
}
Проблема
При компиляции в MacOS проблем не возникает.
Однако при компиляции в rasbian я получаю ошибку error: 'SIGINT' was not declared in this scope
.
Понятно, что определение SIGINT
- #define SIGINT 2
или подобное - недостижимо при компиляции на rasbian.
Вопрос
Почему я получаю эту ошибку на rasbian, но не на macOS? Это потому, что компилятор не может найти signal.h
?
Я убедился, что include_directories
в CMakeLists.txt содержит необходимые пути включения.
ОБНОВИТЬ
Ошибка устранена при добавлении #include <csignal>
вручную.
Вы не включили signal.h.
Вы включаете некоторые заголовки стандартной библиотеки C++, и в качестве побочного эффекта в MacOS они включают signal.h. Однако это не указано, поэтому вы не можете полагаться на его работу в различных реализациях этих заголовков.
Попробуйте добавить:
#include <signal.h>
наверху.
Спасибо за предложение, я попробовал, но все равно получил ту же ошибку. Однако ошибка разрешилась, когда я включил <csignal>
. Буду признателен, если кто-нибудь уточнит.
В Linux включаемый заголовочный файл:
#include <signal.h>
В MacOS эквивалентный файл заголовка для включения:
#include <csignal.h>
В зависимости от вашей ОС файлы заголовков всегда меняются. Они оба должны делать одно и то же, хотя
signal.h
отсутствует