场景

工程添加ASIO源码,编译提示出错:

“signal”: 不是“`global namespace'”的成员

“signal”: 找不到标识符

相关代码出错位置:

void asio_signal_handler(int signal_number)
{
#if defined(ASIO_WINDOWS) \
  || defined(ASIO_WINDOWS_RUNTIME) \
  || defined(__CYGWIN__)
  signal_set_service::deliver_signal(signal_number);
#else // defined(ASIO_WINDOWS)
      //   || defined(ASIO_WINDOWS_RUNTIME)
      //   || defined(__CYGWIN__)
  int saved_errno = errno;
  signal_state* state = get_signal_state();
  signed_size_type result = ::write(state->write_descriptor_,
      &signal_number, sizeof(signal_number));
  (void)result;
  errno = saved_errno;
#endif // defined(ASIO_WINDOWS)
       //   || defined(ASIO_WINDOWS_RUNTIME)
       //   || defined(__CYGWIN__)

#if defined(ASIO_HAS_SIGNAL) && !defined(ASIO_HAS_SIGACTION)
  ::signal(signal_number, asio_signal_handler);
#endif // defined(ASIO_HAS_SIGNAL) && !defined(ASIO_HAS_SIGACTION)
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.


原因

通过VAssistX的Go按钮,查看其对应的头文件所在路径和文件名称。发现文件路径是C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt路径中找到声明文件,该函数声明在signal.h文件中

目的平台SDK选择8.1,但是8.1SDK没有安装对应的头文件,,但是系统安装了其他版本的SDK,在C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt路径中找到声明文件

可以安装8.1SDK的开发包,也可以直接引入头文件,毕竟仅仅是告知编译器其函数声明


解决方案

方案一:将工程SDK切换到10.0.10240.0

方案二:C/C++常规/附加目录添加C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt

通过VAssistX的Go按钮,查看其对应的头文件所在路径和文件名称。目的平台SDK选择8.1,但是8.1SDK没有安装对应的头文件,该函数声明在signal.h文件中,但是系统安装了其他版本的SDK,在C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt路径中找到声明文件