Переопределить путь поиска заголовка по умолчанию - PullRequest
8 голосов
/ 03 ноября 2011

В настоящее время я пытаюсь заставить программу компилироваться в системе, которую я не могу контролировать.

Проблема, с которой я сталкиваюсь, заключается в том, что каталоги включения выглядят так:

/usr/include:
gmpxx.h gmp.h

/usr/local/include:
gmp.h

В моем файле cpp я использую

#include <gmpxx.h>

, и он находит правильный файл в /usr/include, однако, когда gmpxx.h включает в себя gmp.h, он извлекает его из /usr/local/include, который нарушает сборку.

Прямо сейчас я вижу 3 очень уродливых решения проблемы

  1. В моем файле cpp добавьте #include </usr/include/gmp.h>
    ИмеяПуть абсолютного включения довольно уродлив и непереносим, ​​и я думаю, что такого рода вещи должны принадлежать Makefile, а не исходному тексту.

  2. добавить флаг -nostdinc в мой make-файли укажите пути включения вручную

  3. создайте локальные символические ссылки на библиотеки, которые мне действительно нужны, а затем выполните локальные включения (#include "gmp.h")

Есть ли лучшее решение, которое мне не хватает?

Ответы [ 2 ]

14 голосов
/ 03 ноября 2011

Пути поиска для включений принимаются в следующем порядке:

Итак, вы можете использовать любой из первых двух (в зависимости от того, что лучше или удобнее для ваших целей).

0 голосов
/ 03 ноября 2011

Удалите gmp.h из / usr / local / include или выясните, почему у вас есть дистрибутив программного обеспечения, который хочет иметь gmp.h в / usr / local / include, и удалите дистрибутив.Я думаю, что проблема вызвана тем, что у вас по какой-то причине два конфликтующих набора заголовочных файлов для GMP.Если у вас есть стандартная установка файлов разработки GMP в вашей системе (/ usr / include / ...), не должно быть причины иметь другой набор заголовков в /usr/local/include/.

Нет другого способа исправить это, потому что вы должны включить gmpxx.h, используя угловые скобки

#include <gmpxx.h>

, как и вы.Теперь gmpxx.h включает в себя gmp.h с использованием угловых скобок, и в вашей системе / usr / local / include имеет приоритет над / usr / include, что имеет смысл.

Поэтому я бы порекомендовал вамвыясните, почему есть два gmp.h и уберите поддельный.В настройках заголовочного файла есть что-то подозрительное.

Вы не можете легко переставить / usr / include и / usr / local / include, потому что они считаются системными каталогами включения, и если вы пытаетесь использовать -I на них, GCC будет игнорировать эту опцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...