C++ 支持linux/types.h OSX

C++ 支持linux/types.h OSX,c++,macos,C++,Macos,我正在尝试使用OSX交叉编译一个应用程序。然而,当我编译时,我得到了以下结果 fatal error: 'linux/types.h' file not found 当我切换到sys/types.h,现在我得到 error: unknown type name '__s32' unknown type name '__u8' unknown type name '__u16' etc 有人能帮我处理这个问题吗?这些头是内核使用的头。问题可能在于跨平台(在我们的例子中是Linux与Ma

我正在尝试使用OSX交叉编译一个应用程序。然而,当我编译时,我得到了以下结果

fatal error: 'linux/types.h' file not found
当我切换到sys/types.h,现在我得到

 error: unknown type name '__s32'
 unknown type name '__u8'
 unknown type name '__u16'
 etc

有人能帮我处理这个问题吗?

这些头是内核使用的头。问题可能在于跨平台(在我们的例子中是Linux与Mac OS)的此类头文件的实现和定义。POSIX定义不适用于内核,而是适用于它向用户空间公开的系统调用。

显然,特定于Linux的头文件不会出现在MacOS/X下,它不是基于Linux的

解决此问题最简单的方法是检查您的程序并替换

#include "linux/types.h"
为此:

#include "my_linux_types.h"
。。。并编写一个名为my_linux_types.h的新头文件,并将其添加到项目中;它看起来像这样:

#ifndef my_linux_types_h
#define my_linux_types_h

#ifdef __linux__
# include "linux/types.h"
#else
# include <stdint.h>
typedef int32_t __s32;
typedef uint8_t __u8;
typedef uint16_t __u16;
[... and so on for whatever other types your program uses ...]
#endif

#endif
\ifndef my_linux_类型\u h
#定义我的linux类型
#ifdef_uuuLinux__
#包括“linux/types.h”
#否则
#包括
typedef int32_t__s32;
类型定义uint8___u8;
类型定义uint16\u t\u16;
[…等等,对于您的程序使用的任何其他类型…]
#恩迪夫
#恩迪夫

我明白所有这些,如果你给我一个解决办法,我会点头同意你。那么这些是在posix中定义的?OSX上不支持posix?这些是内核定义(至少在Linux平台上是/Linux/*.h,它们是内核使用的宏)。例如,SIGKILL是一个用户空间宏,posix/SUS保证它在UNIX系统中具有相同的值。MAC OS是经过认证的UNIX系统,它保证此宏在所有UNIX系统上的值为9。另一方面,Linux不是经过认证的UNIX,但它试图跟上POSIX/SUS的定义。可能很难在不同的平台上实现像您这样的应用程序功能,因为它使用非常特定的平台定义。我明白所有这些,但根本的问题是如何让它们在OSX上工作。它们可能有相同的值,但它们没有相同的名称或头文件。另外,OSX是经过UNIX认证的?我原以为它是基于BSD的,而BSD没有得到认可:使用
int32\u t
uint8\u t
、和
uint16\u t
,而不是不可移植的类型。这正是我一直在寻找的,我必须等20个小时才能给你,这样你很快就能得到赏金,为什么一开始就不用呢?从c++11开始,它就在标准中。或者应用程序不是由问题作者编写的?通常在移植程序时,您希望更改原始代码库中尽可能少的行。