Как написать общие функции для повторного использования в C - PullRequest
0 голосов
/ 12 мая 2019

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

Первый файл: cat test1.h

void say();

Второй файл: cat test1.c

void say(){
  printf("This is c example!");
}

Третий файл: cat test2.c

include "test1.h"
void main(){
  say();
}

, но когда я запустил: gcc -g -o test2 test2.c, он выдал ошибку как:

undefined reference to `say'

Дополнительно: я знал, что это сработает: gcc -g -o test2 test1.c test2.c но я не хочу этого делать, потому что другая команда будет использовать сервер, и я надеюсь, что они напрямую используют мой двоичный код, а не исходный код.Я надеюсь, что так же, как мы используем функцию printf (), нам просто нужно включить.

Ответы [ 4 ]

2 голосов
/ 12 мая 2019

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

Механика немного различается в зависимости от платформы (хотя Windows и Unix являются основным отличием)также существуют различия между платформами Unix), а также в типе библиотеки (статический архив или динамически связанные / загруженные библиотеки - также известные как общие объекты или общие библиотеки).

В общих чертах, для системы Unixсо статической библиотекой вы бы:

  • скомпилировали объектные файлы библиотеки libfile1.o, libfile2.o,… используя (например) gcc -c libfile1.c libfile2.c.
  • Создать архив изобъектные файлы - например, ar r libname.a libfile1.o libfile2.o.
  • Скопируйте заголовки в стандартное расположение, например /usr/local/include.
  • Скопируйте библиотеку в стандартное расположение, например /usr/local/lib.
  • Вы скомпилируете любой код, который использует библиотечные функции, с помощью -I/usr/local/include (если это не стандартная опция компиляции).
  • Youсвязать программы с -L/usr/local/lib -lname (вам может не потребоваться указывать -L…, но вам нужно будет указать -lname).
1 голос
/ 12 мая 2019

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

Вы также можете поместить много объектных файлов в библиотеку.

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

1 голос
/ 12 мая 2019

Включение заголовочного файла не делает функцию доступной. Он просто сообщает компилятору, что функция будет предоставлена ​​позже.

Вы должны скомпилировать файл с функцией в разделяемый объектный файл (или библиотеку, если существует более одной функции, которой вы хотите поделиться). Обратите внимание на переключатель -c, который говорит gcc не создавать исполняемый файл:

gcc -o test1.o test1.c -c 

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

gcc -o test2 test2.o test1.o

Процесс может быть автоматизирован с помощью make.

0 голосов
/ 12 мая 2019

вам также нужно скомпилировать test1: gcc -g -o test2 test1.c test2.c.

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