1

当我输入gcc -v时,它只是显示相同...

我已经在 Debian 中尝试过了,它的行为正常..

我只在拱门中遇到这个问题,我该如何解决?

4

1 回答 1

1

uname -i是不可移植的,man uname可以编译出来。我的新 Debian 8 也将其打印为

$ uname -i
unknown

unameGNU coreutils的一部分,它是一个非常简单的程序。你可以在 savannah 上看到代码。如果您查看命令行选项,--hardware-platform则有-i

  88 static struct option const uname_long_options[] =
  89 {
  90   {"all", no_argument, NULL, 'a'},
  ...
  97   {"machine", no_argument, NULL, 'm'},
  98   {"processor", no_argument, NULL, 'p'},
  99   {"hardware-platform", no_argument, NULL, 'i'},
 100   {"operating-system", no_argument, NULL, 'o'},
 101   {GETOPT_HELP_OPTION_DECL},
 102   {GETOPT_VERSION_OPTION_DECL},
 103   {NULL, 0, NULL, 0}
 104 };

这会强制打印定义PRINT_HARDWARE_PLATFORM

 198       while ((c = getopt_long (argc, argv, "asnrvmpio",
 199                                uname_long_options, NULL)) != -1)
 200         {
 201           switch (c)
 202             {
 ...
 227             case 'p':
 228               toprint |= PRINT_PROCESSOR;
 229               break;
 230 
 231             case 'i':
 232               toprint |= PRINT_HARDWARE_PLATFORM;
 233               break;

反过来,默认情况下会打印“未知”。

 344   if (toprint & PRINT_HARDWARE_PLATFORM)
 345     {
 346       char const *element = unknown;
 347 #if HAVE_SYSINFO && defined SI_PLATFORM
 348       {
 349         static char hardware_platform[257];
 350         if (0 <= sysinfo (SI_PLATFORM,
 351                           hardware_platform, sizeof hardware_platform))
 352           element = hardware_platform;
 353       }
 354 #endif

如果我没记错的话(我可能是)HAVE_SYSINFO应该在 中sys/systeminfo.h,并且默认情况下该文件不存在于arch. 这并不一定意味着编译包时它不存在。然而,它表明,最有可能的是,打包程序并没有费心用HAVE_SYSINFO正确的设置来编译包。这是可以接受的,因为它是一个不可移植的选项。


请参阅我的评论gcc -v,我的拱门将其正确评估为Target: x86_64-pc-linux-gnu. 但这与它无关unameuname发送系统调用以打印有关系统的信息,gcc将目标编译到其中。


注意:说这uname是一部分coreutils并不是 100% 正确的。 uname是 POSIX 标准的一部分,但-i( --hardware-platform) 选项uname不是该规范的一部分。 -i仅由coreutils软件包实现(见鬼,*BSD 系统有-i,但它在那里有完全不同的含义)。

于 2016-05-31T17:03:51.187 回答