"program_invocation_name" не скомпилировано под MacOS - PullRequest
0 голосов
/ 26 мая 2020

Попытка напечатать имя программы, используя имя_программы_инвокации

#include <stdio.h>
#define _GNU_SOURCE
#include <errno.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  extern char *program_invocation_name;
  printf("%s \n", program_invocation_name);

  exit(EXIT_SUCCESS);
}

Используя команду g cc filename. c -o filename , указанное выше код работает в Linux, но НЕ компилируется под MacOS:

gcc filename.c -o filename
Undefined symbols for architecture x86_64:
  "_program_invocation_name", referenced from:
  _main in filename-4acad8.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

От Glib c Замены функций под 12.14 Glib c Расширения до errno.h :

12.14.1 program_invocation_name

Проблемы переносимости, не исправленные Gnulib:

Эта переменная отсутствует на некоторых платформах: Ma c OS X 10.5, FreeBSD 6.0, NetBSD 5.0, OpenBSD 3.8, Minix 3.1.8, AIX 5.1 , HP-UX 11, IRIX 6.5, OSF / 1 5.1, Solaris 11.4, Cygwin 1.7.7, mingw, MSV C 14, Interix 3.5, Android 9.0.

0 голосов
/ 26 мая 2020

program_invocation_name не является частью какого-либо стандарта; это расширение, предоставляемое glib c и некоторыми другими системами; MacOS не входит в их число. Использовать его так, как вы делаете здесь, неоправданно непереносимо и бессмысленно. Просто используйте argv[0].

Единственная точка program_invocation_name - это функции, которые не являются main и не имеют контракта для main, чтобы передать им argv[0] или иным образом сделать он доступен для получения (начального) значения argv[0].

...