Не могу скомпилировать с gcc-7 - PullRequest
2 голосов
/ 08 ноября 2019

Я пытаюсь скомпилировать некоторый код с GCC-7 на MacOS Catalina. GCC-7 был установлен с использованием homebrew brew install gcc@7

Код следующий:

#include <stdlib.h>
#include <math.h>


double distance(double *a, double *b, int d) {
    double dist = 0;
    for(int i = 0; i < d; i++) {
        dist += pow(a[i]-b[i],2);
    }
    return sqrt(dist);
}


double *computeDistances (double *X, int n, int d) {
   double *dist = malloc( (n-1) * sizeof(double) );
   double *vp = X + (n-1)*d;
     for(int i = 0; i < n-1; i++) {
   dist[i] = distance(&(X[IDX(d,i,0)]), vp, d);
  }
  return dist;
}

Я компилирую с gcc-7 -Iinc/ -o lib/test.o -c src/test.c

и вывод:

In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/wait.h:110:0,
                 from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h:66,
                 from src/test.c:1:
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/resource.h: In function 'getiopolicy_np':
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/resource.h:443:34: error: expected declaration specifiers before '__OSX_AVAILABLE_STARTING'
 int     getiopolicy_np(int, int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
                                  ^~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/resource.h:449:39: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__OSX_AVAILABLE_STARTING'
 int     setiopolicy_np(int, int, int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
                                       ^~~~~~~~~~~~~~~~~~~~~~~~
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/libkern/_OSByteOrder.h:66:0,
                 from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_endian.h:130,
                 from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/i386/endian.h:99,
                 from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/machine/endian.h:35,
                 from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/wait.h:186,
                 from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h:66,

/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/resource.h:443:1: error: parameter name omitted
src/test.c:21:1: error: expected '{' at end of input
 }
 ^

Там, где я не включаю stdlib.h, это работает. Я думаю, что что-то не так в заголовочных файлах.

1 Ответ

2 голосов
/ 09 ноября 2019

Преобразование комментария в ответ.

Быстрое исправление

Добавление #include <stdio.h> перед #include <stdlib.h> - или почти любым другим стандартомзаголовок. Эта ошибка появляется, только если <stdlib.h> является первым системным заголовком. Я не понял, почему.

В вашей программе поменяйте местами строки #include <math.h> и #include <stdlib.h>;затем он скомпилируется (при условии, что вы включите что-то, что определяет IDX).

Фон

Я отметил это в комментариях к вопросам и ответам о Не могу скомпилировать программу на CMac после обновления до Catalina 10.15 - в частности, комментарии 1 и 2 . При форматировании они говорят:

Одна странность - у меня есть какой-то код, который начал #include <stdlib.h>, а затем не смог скомпилировать жалобу на:

In file included from …/usr/include/sys/wait.h:110,
from …/usr/include/stdlib.h:66,
from bm.c:27:
…/usr/include/sys/resource.h:443:9: error: no previous prototype for ‘getiopolicy_np’ [-Werror=missing-prototypes]
443 | int getiopolicy_np(int, int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);

Тем не менее, когда я добавляю #include <ctype.h> до #include <stdlib.h> компилируется нормально. Я все еще работаю над тем, что это значит и как с этим справиться автоматически. Элементами являются пути:

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/

Используя принятый ответ на этот вопрос, была задана переменная среды CPATH:

export CPATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include

Другой (близкий к минимальному)Вариант на этом:

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    printf("Hello World!\n");
    return EXIT_SUCCESS;
}

С заголовками в последовательности <stdlib.h> затем <stdio.h> код не компилируется;с заголовками в обратной последовательности код компилируется без зазубрин. Что-то странное в <stdlib.h>. Порядок стандартных заголовков, подобных этому, должен не влиять на компиляцию, но влияет. В этом есть что-то очень странное, потому что нативные компиляторы XCode (/usr/bin/gcc или /usr/bin/clang)не сталкивайтесь с той же проблемой.

Применение к коду в вопросе

Применение этого к коду в вопросе, размещение #include <math.h> перед #include <stdlib.h> позволяет избежать ошибоксообщается в вопросе. Однако этот код не компилируется, потому что IDX не определен или не объявлен (и не существует предшествующих прототипов для двух функций, но не все используют параметры компилятора для обеспечения того, чтобы нестатические функции объявлялись перед их использованием или определением). ).

#include <math.h>
#include <stdlib.h>

// ...and a definition of IDX
// ...and maybe declarations of distance() and computeDistances()

double distance(double *a, double *b, int d)
{
    double dist = 0;
    for (int i = 0; i < d; i++)
        dist += pow(a[i] - b[i], 2);
    return sqrt(dist);
}

double *computeDistances(double *X, int n, int d)
{
    double *dist = malloc((n-1) * sizeof(*dist));
    double *vp = X + (n-1) * d;
    for (int i = 0; i < n-1; i++)
        dist[i] = distance(&(X[IDX(d, i, 0)]), vp, d);
    return dist;
}

Предостережения

Однако, как я уже отмечал выше, я не до конца установил, в чем причина проблемы, только в том, что проблема возникает именно так, как описано в вопросе. (имена файлов и номера строк и все), и что есть простой, но не очевидный обходной путь. Я обнаружил проблему при компиляции директории библиотеки, содержащей около 200 исходных файлов и чуть более 100 заголовков;большинство из них работало нормально, но 6 или около того, которые не компилировались, имели <stdlib.h> в качестве первого включенного заголовка.

Параметры компилятора:

gcc -O3 -g -std=c11 -pedantic -Wall -Wextra -Werror -Wshadow -Wmissing-prototypes \
    -Wpointer-arith -Wwrite-strings -Wold-style-definition -Wcast-qual -Wstrict-prototypes \
    -o trial-1 trial-1.c

GCC - самодельный9.2.0 скомпилировано на macOS 10.14 Mojave.

...