问题 支持linux / types.h OSX


我试图使用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

有人可以帮我解决这个问题吗?


2113
2017-11-30 16:47


起源

建议:使用 int32_t, uint8_t,和 uint16_t 而不是非便携式的。 - asveikau
这正是我正在寻找的 - Jackie


答案:


显然,特定于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

13
2018-01-17 18:19



说我要等20个小时才能给你,所以你很快就会有赏金 - Jackie
为什么不首先使用<cstdint>?从c ++ 11开始,它就是标准。或者申请不是由提问者撰写的? - Daniel
通常在移植程序时,您希望将原始代码库中的几行更改为可以躲开的程序。 - Jeremy Friesner


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


1
2018-01-17 18:16



我得到了所有这些,如果你给我一个方法,我会给你点头。那么这些是在posix中定义的吗? OSX不支持和posix? - Jackie
这些是内核定义(至少,在Linux平台上是/linux/*.h。它们是内核使用的宏)例如,SIGKILL是一个用户空间宏,由POSIX / SUS保证有UNIX系统中的值相同。 MAC OS是经过认证的UNIX系统,可确保此MACRO在所有UNIX系统上的值均为9。另一方面,Linux不是经过认证的UNIX,但它试图跟上POSIX / SUS定义。由于它使用非常特定的平台定义,因此可能很难使像您这样的应用程序在不同平台上运行 - Alex
谢谢我得到了所有这些,但基本问题是如何让他们在OSX上工作。它们可能具有相同的值,但它们没有相同的名称或头文件。另外,OSX是经过认证的UNIX吗?我认为这是基于没有认证的BSD - Jackie
你是对的,BSD不是UNIX认证的,但OS X是。 - Alex