未知类型名称' siginfo_t'与Clang一起使用_POSIX_C_SOURCE 2,为什么?

时间:2014-04-07 12:38:57

标签: c clang c99

更新 Turnes out我的讲师将接受写入GNU99标准的代码,因此,正如User1指出的那样,我在程序开始时使用了_GNU_SOURCE。 (有关详细信息,请参阅man feature_test_macros。)感谢您帮助我理解!

在Ubuntu 13.10和Clang 3.4,GCC 4.8.1上,我正在做一项要求我使用C99标准的作业。 (我也从SVN安装了GNUstep)

WRT GCC,我想我在这些文件夹中安装了4个版本:

/usr/lib/gcc/x86_64-linux-gnu/4.7
/usr/lib/gcc/x86_64-linux-gnu/4.7.3
/usr/lib/gcc/x86_64-linux-gnu/4.8
/usr/lib/gcc/x86_64-linux-gnu/4.8.1

gcc --version报告4.8.1,clang --version报告3.4。 ld -v报告2.23.52.20130913

我正在编写一个信号处理程序,当我在函数头中使用siginfo_t时,我收到编译器错误:unknown type name 'siginfo_t'我正在使用sigaction()来安装处理程序。

在研究需要做什么以及如何做的时候,我能够编译一个简单的演示,它也使用相同的函数头定义,并且它可以工作。但它不仅限于C99。

这些是我的包含(其中signal.h是一个):

#define _POSIX_C_SOURCE 2

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <math.h>
#include <ctype.h>
#include <libgen.h>
#include <signal.h>

这是我的信号处理函数(仅用于调试目的):

static void sigSIGCHLDhandler(int sigNum, siginfo_t *siginfo, void *context) {

        printf("PID = %ld",(long) siginfo->si_pid);

}

我正在使用clang -Wall 现在-std=c99选项与-std=gnu99进行编译。

我已经尝试了locate signal.h,我在/usr/include中有了它。我尝试添加#include <bits/siginfo.h>并允许我编译,但二进制文件无法正常工作 (我的系统上有一堆signal.hsiginfo.h个文件。)

另一名学生表示我的设置有问题。所以我重新安装了Clang。以下是我认为可能相关的一些环境变量(请通知我任何遗漏或错误的

LD_LIBRARY_PATH=/home/user/ros_catkin_ws/install_isolated/lib:/home/user/GNUstep/Library/Libraries:/usr/local/lib
CPATH=/home/user/ros_catkin_ws/install_isolated/include
PATH=/home/user/ros_catkin_ws/install_isolated/bin:/home/user/GNUstep/Tools:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/user/bin:/usr/local/java/jdk1.7.0_51/bin
CLASSPATH=/home/user/GNUstep/Library/Libraries/Java:/usr/local/lib/GNUstep/Libraries/Java
LIBRARY_COMBO=gnu-gnu-gnu
INFOPATH=/usr/local/share/info::/home/user/GNUstep/Library/Documentation/info:
GNUSTEP_IS_FLATTENED=yes
GNUSTEP_LOCAL_ROOT=/usr/local/Local
GNUSTEP_HOST=x86_64-unknown-linux-gnu
GUILE_LOAD_PATH=/home/user/GNUstep/Library/Libraries/Guile:/usr/local/lib/GNUstep/Libraries/Guile
GNUSTEP_MAKEFILES=/usr/local/share/GNUstep/Makefiles
GNUSTEP_NETWORK_ROOT=/usr/local/Network
GNUSTEP_FLATTENED=yes
GNUSTEP_HOST_OS=linux-gnu
GNUSTEP_HOST_VENDOR=unknown
GNUSTEP_HOST_CPU=x86_64
GNUSTEP_USER_ROOT=/home/user/GNUstep
GNUSTEP_SYSTEM_ROOT=/usr/local/System
GNUSTEP_PATHLIST=/usr/local/System:/usr/local/Network:/usr/local/Local:/home/user/GNUstep
GNUSTEP_SYSTEM_ROOT=/usr/local/System
GNUSTEP_PATHLIST=/usr/local/System:/usr/local/Network:/usr/local/Local:/home/nap/GNUstep

我花了几个小时寻找修复但却找不到任何东西,而且我没有想法。 什么坏了?

1 个答案:

答案 0 :(得分:8)

如果您查看sigaction(2)的手册页,您将找到以下内容:

  

siginfo_t:_POSIX_C_SOURCE&gt; = 199309L

尝试添加编译器选项:-D_POSIX_C_SOURCE=199309L

它告诉你所需的posix版本到你的c-lib(glibc)。

编辑:

详细了解POSIX wiki page的内容。

featuers.h详细介绍了glibc如何使用define:

   _POSIX_C_SOURCE  
          If ==1, like _POSIX_SOURCE; 
          if >=2 add IEEE Std 1003.2;
          if >=199309L, add IEEE Std 1003.1b-1993;
          if >=199506L, add IEEE Std 1003.1c-1995;
          if >=200112L, all of IEEE 1003.1-2004

手册页中的类似信息:feature_test_macros(7)

所以:_POSIX_C_SOURCE = 2没有带来最新的POSIX功能,因为1003.2(posix 2)不是最新的功能。要获得更多功能,您需要定义更高版本。

不要混淆:POSIX.2并不比POSIX.1c新。