Когда требуется заголовочный файл для использования статической библиотеки?

Если я создам статическую библиотеку на С++ в Linux, так что будет создан файл «.a», как мне (или кому-либо еще) использовать эту библиотеку? Например, моя библиотека определяет класс. Я предполагаю, что недостаточно просто предоставить файл «.a», но также предоставить файл заголовка. Как узнать, какие файлы заголовков должны быть предоставлены с файлом «.a»?

Например, нужно ли мне предоставлять все файлы заголовков, которые были включены в код моей библиотеки?


person synaptik    schedule 16.12.2012    source источник


Ответы (4)


Техническая причина использования заголовочных файлов заключается в том, чтобы сообщить компилятору об именах и размерах при компиляции пользовательского кода, чтобы он мог упорядочить пользовательские объекты. макет.

Именно по этой причине private член классов public (обратите внимание на выделение: public здесь не ключевое слово) должен быть представлен в заголовках.

Вы можете не показывать классы, размещенные в открытых частях, только как указатели или ссылки, поскольку их реальный экземпляр не останется в самом результирующем пользовательском объекте. В этом случае вы можете объявить только имя.

Вы должны, по сути, предоставить пользователю все объявления, которые

  • код пользователя должен получить доступ
  • каким-то образом влияет на размер и состав пользовательских объектов (даже без прямого ведома пользователя).
person Emilio Garavaglia    schedule 16.12.2012

Заголовочные файлы содержат «объявления» для классов и функций. Они необходимы компилятору, поэтому он может а) проверить, что вы передаете правильные параметры и/или устанавливаете правильные члены данных классов/структур, и б) чтобы он мог знать, как вызывать эти функции.

void do_something(int a, std::string& s);

сообщает компилятору, что эта функция ожидает два параметра: int и string&. Это подтверждает, что вы передаете правильные типы параметров (конструкция на уровне языка), и объясняет, что ожидает объектный код в скомпилированной библиотеке (два аргумента — как определяется соглашением о вызовах).

Если эта скомпилированная библиотека использует код из другой библиотеки, вам не нужно предоставлять эти заголовки, поскольку они не имеют ничего общего с написанным вами кодом. Библиотеки работают на уровне «бинарного интерфейса приложения» (ABI), а не на уровне «интерфейса прикладного программирования» (API). Это означает, что они просто передают указатели и т. д. Не параметры с типами C.

person Jonathon Reinhart    schedule 16.12.2012

Как узнать, какие файлы заголовков должны быть предоставлены с файлом «.a»?

Как правило, это все заголовочные файлы, описывающие функции, к которым пользователь должен иметь доступ. Это означает, что ответ на

мне нужно предоставить все файлы заголовков, которые были включены где-либо в коде

обычно «Нет, вы этого не сделаете» - могут быть внутренние/частные заголовки, которые вы не раскрываете.

person Community    schedule 16.12.2012
comment
Предположим, что один из элементов данных класса, который я хочу, чтобы другие могли использовать, имеет тип, определенный в другом заголовочном файле. Нужно ли в этом случае предоставлять оба заголовочных файла? - person synaptik; 16.12.2012
comment
@synaptik это зависит от. Если это частный/внутренний тип, то вы этого не сделаете, а затем просто объявите этот тип. Если он общедоступен, то да, вы также раскрываете этот заголовок. - person ; 16.12.2012
comment
Итак, если тип — Vehicle (который является классом), то потенциально я могу просто объявить следующее: Class Vehicle; Это то, что вы имеете в виду? - person synaptik; 16.12.2012
comment
Спасибо! Это очень помогает. - person synaptik; 16.12.2012
comment
Проблема: когда я объявляю класс типа Vehicle; а затем ниже этого объявления определите член другого класса как Vehicle r;, затем при попытке скомпилировать я получаю эту ошибку: поле «r» имеет неполный тип. Любые идеи? - person synaptik; 16.12.2012
comment
@synaptik Вы можете объявлять только те типы, на которые у вас есть указатели. - person ; 16.12.2012

Если вы хотите использовать класс, я предполагаю, что вы уже знаете, как называется этот класс. В этом случае вы можете просто найти заголовок, в котором определен класс, и включить его.

person Luchian Grigore    schedule 16.12.2012