SIGINT 未在此范围内声明

rai*_*san 2 makefile cmake c++11 raspbian cpprest-sdk

背景

我正在尝试为在 Raspberry 3 上运行的 Rasbian 构建一个示例 REST api 应用程序。我使用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();
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

问题

在 MacOS 上编译时,没有出现任何问题。

但是,在 rasbian 中编译时,error: 'SIGINT' was not declared in this scope出现错误。

很明显,在 rasbian 上编译时无法达到SIGINT定义 -#define SIGINT 2或类似的 - 。

为什么我在 rasbian 上收到这个错误,而在 macOS 上没有?是因为编译器找不到signal.h吗?

我确保include_directories在 CMakeLists.txt 中包含必需的包含路径。

更新

当我手动添加#include <csignal>.

she*_*ond 6

您还没有包含 signal.h。

您包含了一些 C++ 标准库头文件,作为对 MacOS 的副作用,这些头文件碰巧包含了 signal.h。但是,这并未指定发生,因此您不能依赖它在这些标头的不同实现中工作。

尝试添加:

#include <signal.h>
Run Code Online (Sandbox Code Playgroud)

在顶部。