2016-04-28 2 views
0

Я работаю над встроенным проектом в C. Инструментарий, предоставляемый нашим поставщиком, включает ограниченную библиотеку C, в которой отсутствуют некоторые стандартные функции POSIX. Например, они имеют time.h, но некоторые функции POSIX не учитываются. Я хочу включить в проект некоторые библиотеки C из источника, которые используют #include <time.h> и ожидают, что эти функции будут существовать. Есть ли способ собрать эти библиотеки без необходимости изменять их исходный код или нет выбора, кроме как создать другой заголовок, возможно, с именем time_suppl.h с дополнительными функциями и отредактировать все исходные файлы библиотеки, чтобы включить это, когда они включают time.h?Как переопределить заголовки системной библиотеки?

+1

Я бы сделал 'time_suppl.h' и' # include' его в ''. Каждый раз, когда вы обновляете инструментальную цепочку, вам нужно исправить «», но это похоже на меньшее обслуживание, чем редактирование файлов библиотеки при каждом обновлении библиотеки. – user3386109

+1

Встроенные системы Bare-metal не совместимы с POSIX, и многие из них не являются ОС. – Olaf

+2

Ваша проблема гораздо глубже, чем пропущенные объявления. Вы, по-видимому, также не учитываете * реализации * функций, о которых идет речь. Простое предоставление заголовков совершенно неадекватно для решения этой проблемы. –

ответ

1

Ответ заключается в том, что это зависит от вашего компилятора, но обычно есть способ сделать это без изменения инструментальной цепочки или библиотеки, которую вы пытаетесь скомпилировать. Вместо этого вы просто изменяете путь поиска include, используемый компилятором. Вот два полезных примеров того, как это сделать:

  • Для GCC это просто, используя -I опции добавить в пути поиска системных заголовков, с более высоким приоритетом, так что это так же просто, как с помощью этого параметра, чтобы указать местоположение с файлами, которые имеют то же самое, что и системные заголовки, такие как time.h. Полная документация по gcc.gnu.org говорит:

Добавить реж каталог в список каталогов, которые искали заголовочных файлов. См. Путь поиска. Каталоги, названные -I, ищут , прежде чем в стандартную систему включены каталоги.

  • Для собственной ARMCC компилятора есть -J вариант, который позволяет изменить заголовок системы поиска пути полностью, который описан более подробно in their documentation.
0

Это больше в дополнение к ответу @ satur9nine, но вы можете сделать это без копирования всего time.h. Если вы используете GCC, вы можете использовать директиву препроцессора #include_next, чтобы включить «следующий» экземпляр файла в путь поиска. Рассмотрим следующий пример:

В /home/me/test_include/time.h:

#include_next <time.h> // Will pull in the standard time.h 
int myNewTimeFunction(); 

Если вы затем компилировать с помощью gcc -I/home/me/test_include, то ваша новая функция будет иметь декларацию при #include <time.h>.

Этот является расширение GCC - YMMV с другими компиляторами.