Search code examples
c++11makefileraspbian

SIGINT was not declared in this scope


Background

I am trying to build a sample REST api app for Rasbian running on Raspberry 3. I used cpprestsdk.

Sample contains the following header file:

#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();
        }
    };
}

Issue

When compiling on MacOS, no problem occurs.

When compiling in rasbian however, I get error: 'SIGINT' was not declared in this scope error.

It is clear that SIGINT definition - #define SIGINT 2 or similar - is not reachable when compiling on rasbian.

Question

Why I am getting this error on rasbian but not on macOS? Is it because compiler cannot locate signal.h?

I made sure that include_directories in CMakeLists.txt contains required include paths.

UPDATE

Error resolved when I manually added #include <csignal>.


Solution

  • You haven't included signal.h.

    You're including some C++ standard library headers, and as a side effect on MacOS, these happen to include signal.h. However, that isn't specified to happen so you can't rely on it working in different implementations of those headers.

    Try adding:

    #include <signal.h>
    

    at the top.