更新 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.h
和siginfo.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
我花了几个小时寻找修复但却找不到任何东西,而且我没有想法。 什么坏了?
答案 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新。