更新 Turnes我的讲师将接受写入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
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
这是我的信号处理函数(仅用于调试目的):
static void sigSIGCHLDhandler(int sigNum, siginfo_t *siginfo, void *context) {
printf("PID = %ld",(long) siginfo->si_pid);
}
Run Code Online (Sandbox Code Playgroud)
我正在编译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
Run Code Online (Sandbox Code Playgroud)
我花了几个小时寻找修复但却找不到任何东西,而且我没有想法.什么坏了?
如果您查看sigaction(2)的手册页,您将找到以下内容:
siginfo_t:_POSIX_C_SOURCE> = 199309L
尝试添加编译器选项: -D_POSIX_C_SOURCE=199309L
它告诉你的c-lib(glibc)所需的posix版本.
编辑:
从POSIX维基页面查看更多相关信息.
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
Run Code Online (Sandbox Code Playgroud)
类似的信息也在手册页中:feature_test_macros(7).
所以:_POSIX_C_SOURCE = 2没有带来最新的POSIX功能,因为1003.2(posix 2)不是最新的功能.要获得更多功能,您需要定义更高版本.
不要混淆:POSIX.2并不比POSIX.1c新.