[UNIX]: Нужно ли мне добавлять все библиотеки в make-файл моего проекта, которые используются из библиотеки, используемой в моем проекте? - PullRequest
2 голосов
/ 14 апреля 2011

Ха, это звучит сложнее, чем есть на самом деле. Вот что я имею в виду:

Предположим, я пишу приложение, которое использует потоки. В этом приложении я не использую pthreads напрямую, но я использую оболочку, которая использует pthreads. Таким образом, в make-файле этой оболочки должен быть включен -lpthread. И вопрос - мне нужно включить -lpthread в мой проект, или это не нужно? Или это зависит? Если да, то на чем?

Я спрашиваю это, потому что я видел это много, и я не думаю, что это необходимо .. То же самое для -std=c++0x?


Кроме того, у меня возникла проблема с интерфейсом Informix C ++, так как он опирается на lib, называемый DMI, который построен поверх ESQL/C. Когда я удалил эти библиотеки и использовал только реальную, у меня возникли проблемы с компоновщиком (проблемы с поиском библиотек). Когда я добавил dmi и esql/c, все было хорошо.

Это отвечает на мой вопрос (с "ДА"), или я мог сделать что-то не так, кроме этого (я новичок в makefiles (:)


source : «Makefile-ы - загадочная тема: одна шутка гласит, что в мире есть только один make-файл и что все остальные make-файлы являются его просто расширением. Уверяю вас, однако, что это неправда; я время от времени писал свои собственные make-файлы. "

Это заставило меня задуматься, нужны ли все включенные библиотеки в make-файлы (проектов моей компании), или это по "историческим причинам"


EDIT : Обертка вокруг pthread связана статически, а библиотека Informix была динамически связана, если это имеет значение.
Кроме того, ОС RHEL (4 и 5), но мне нужно знать, зависит ли это от ОС и способа компоновки (динамического или статического)

Ответы [ 3 ]

2 голосов
/ 14 апреля 2011

Если библиотеки каким-то образом не включены в используемую оболочку, ответ - ДА, вам нужно будет включить их в make-файл программы, которая использует оболочку.

Например, если оболочкой является .o, она еще ни с чем не связана. Однако, если оболочкой является .so или .a, она может включать библиотеки в зависимости от того, как вы ее создали. Я думаю, что ar несет ответственность за такого рода вещи.

1 голос
/ 14 апреля 2011

Здесь вы делаете ошибку:

Таким образом, в make-файл этой оболочки должен быть включен -lpthread

Статическая библиотека, созданная arИнструмент - это просто набор объектных файлов в специальном формате, который впоследствии распознается компоновщиком.Эта коллекция кода не связана ни с одной библиотекой.Указывать -lpthread при компиляции каждого из исходных файлов на этом этапе бессмысленно, поскольку не выполняется связывание.

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

Например, это вызывает только компоновщик, поскольку исходные файлы не предоставляются:

gcc -o myprog main.o -lmylib -lpthread

В отличие от этого, компиляция исходного файла в объектный файл и указание библиотеки бессмысленны, поскольку не будет выполняться связывание:

gcc -c wrapper_source.c -lpthread
0 голосов
/ 14 апреля 2011

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

Обычно, когда ваше приложение использует оболочку в общей библиотеке, оно не знает о make-файле оболочки и не может обнаружить, что ему нужно включить pthread.С другой стороны, компоновщик, работающий над вашим приложением, обычно хочет убедиться, что в проекте не осталось неопределенных символов.

Поэтому вам придется добавлять директивы для всех общих библиотек, от которых зависит ваш код.

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