Nano Hash - криптовалюты, майнинг, программирование

Создание проекта от Makefile до статических / динамических библиотек в UNIX

Ребята, не могли бы вы немного рассказать о строительных блоках C ++ в unix.

Я хочу создать приложение, которое ссылается на статические библиотеки и динамические библиотеки (.so).

Вопрос 1: Как создать статическую библиотеку с помощью gcc / g ++? Как сделать так, чтобы мое приложение связывалось с ней.

Вопрос 2: Как указать это в make-файле, связавшись со статическими и динамическими библиотеками, при условии, что обе библиотеки имеют файлы заголовков

Резюме: Я много лет использую make-файлы и библиотеки, написанные кем-то другим. Таким образом, каждый раз, когда я его модифицировал, я просто вырезал и вставлял вещи, не понимая этого. Теперь я хочу спуститься к основанию и более подробно разобраться в процессе сборки / компоновки / создания Makfile.

Какая хорошая книга описывает эти концепции в интимных деталях?

Спасибо

01.03.2009

Ответы:


1

Статические библиотеки обычно архивируются с помощью команды ar. После создания всех объектных файлов (желательно с переключателем -fPIC на GCC) вы можете запустить ar следующим образом:

ar -rs archivename.a list.o of.o objects.o

На странице man описаны варианты.

Динамические библиотеки обычно создаются с переключателем -shared на gcc или ld и с именем выходного файла с расширением .so.

Autotools справляется с этим с помощью программы libtool. Я не знаком с его использованием.

Связывание с этими библиотеками может быть выполнено либо путем перечисления библиотек с помощью переключателя -l (ell) (например, -lX для ссылки на libX.so), либо путем прямого указания их с абсолютными путями (например, добавления /usr/lib/libX.so к вашей команде). Для связывания статических библиотек нужно указать -static перед -l или соответствующий абсолютный путь к .a архиву.

01.03.2009

2

Файл Makefile для создания статической библиотеки, состоящей из кода из foo.cpp, bar.cpp:

PROJECT = library.a
OBJECTS = foo.o bar.o
CFLAGS  = -Wall -pedantic

all: $(PROJECT)

.cpp.o:
        g++ -c $(CFLAGS) $<

$(PROJECT): $(OBJECTS)
        libtool -o $(PROJECT) -static $(OBJECTS)

Файл Makefile для приложения baz.cpp со статической ссылкой на library.a:

PROJECT = baz
CFLAGS  = -Wall -pedantic
OBJECTS = baz.o

all: $(PROJECT)

.cpp.o:
        g++ -c $(CFLAGS) $<

$(PROJECT): $(OBJECTS) library.a
        g++ $(OBJECTS) -L. -llibrary -o $(PROJECT)

Динамическая библиотека оставлена, кхм, в качестве упражнения для читателя.

01.03.2009
  • Что такое флаг -c в gcc. А что насчет файла заголовка? 01.03.2009
  • также, означает ли $ ‹все файлы cpp? зачем вам этот case .cpp.o: g ++ -c $ (CFLAGS) $ ‹он нигде не вызывает? Спасибо 01.03.2009
  • -c означает компилировать, но не связывать. $ ‹- это имя файла без расширения. Проверьте страницы руководства для gcc, make. Заголовочным файлам нет места в Makefile, если они не являются зависимостями. 01.03.2009
  • В первом примере Makefile одна из опций CFLAGS написана с ошибкой -pendantic должна быть -pedantic 07.12.2009
  • Правила суффиксов устарели. gnu.org/s/hello/manual/ make / Suffix-Rules.html # Suffix-Rules Удалите .cpp.o: цель, и вы получите такое же поведение от make-файла с помощью неявного правила для генерации файлов .o. 13.10.2011

  • 3

    Ответ 1: Чтобы создать статическую библиотеку из исходных файлов foo.c и bar.c, сделайте следующее:

    gcc -c foo.c
    gcc -c bar.c
    ar rc mylibrary.a foo.o bar.o
    

    Для получения дополнительной информации об этом прочтите руководство по GCC, чтобы узнать, как использовать компилятор, и компоновщик через компилятор. Также может оказаться полезным руководство по binutils.

    Ответ 2: GNU Make manual неплохое. Чтобы по-настоящему узнать о библиотеках и о том, как они работают, прочитайте книгу Джона Р. Левина Компоновщики и загрузчики.

    Статические библиотеки довольно просты, но общие библиотеки могут быть очень сложными, в зависимости от платформы и степени переносимости, которую вы хотите и в которой нуждаетесь. Например, в некоторых системах статические и разделяемые библиотеки должны быть скомпилированы с разными параметрами для правильной работы (одна должна, а другая не должна компилироваться с позиционно-независимым кодом). Чтобы упростить эту задачу, были разработаны целые структуры утилит (libtool), но они сами по себе не лишены проблем.

    01.03.2009

    4

    Поскольку вы ссылаетесь на gcc, я предполагаю, что вы используете GNU Make. Лучшая документация, которую я нашел для этого, - это официальное руководство, которое охватывает все вам нужно знать понятным языком.

    01.03.2009

    5

    Когда я изучал программирование для Linux, мне очень помогло Advanced Linux Programming. Вы можете проверить раздел «Написание и использование библиотек» в этот pdf. Это довольно много объясняет о библиотеках в Linux.

    01.03.2009
  • Это очень хорошая книга, но я предпочитаю что-нибудь в сочетании с make-файлами. 01.03.2009

  • 6

    вы также можете взглянуть на это: http://www.faqs.org/docs/Linux-HOWTO/Program-Library-HOWTO.html

    12.04.2010
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

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

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..