C ++ ссылки на библиотеки с makefile (newbe) - PullRequest
8 голосов
/ 25 октября 2010

Я пытаюсь понять, как использовать нестандартные библиотеки в моих проектах C ++. У меня есть несколько вопросов.

Допустим, я хочу использовать библиотеку POCO. Поэтому я скачал его и собрал, используя make (статическая сборка). Теперь у меня есть куча файлов .o и .h. В разных каталогах есть файл Path.h и файл Path.o.

Теперь я хочу использовать этот модуль в своем коде. Поэтому я включаю файл, используя #include "Poco / Path.h". Нужно ли изменять make-файл и добавлять Path.o к моей цели?

Что происходит, когда я использую стандартную библиотеку? Они доступны только в заголовочных файлах? Я знаю, что код шаблона не может быть предварительно скомпилирован. А как насчет отдыха?

Ответы [ 2 ]

10 голосов
/ 25 октября 2010

Помимо файлов .h и .o у вас, вероятно, также будет один или несколько файлов libXXX.a и / или libXXX.so. Это фактические библиотечные файлы, с которыми ваше приложение должно связать.

Чтобы использовать библиотеку, вы включаете соответствующие заголовки в исходный файл и изменяете свой make-файл, чтобы сообщить компоновщику, что он также должен связать ваше приложение с библиотекой XXX. Типичная команда компоновщика для этого - -lXXX, и компоновщик будет искать как libXXX.a, так и libXXX.so и использовать тот, который кажется наиболее подходящим.

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

8 голосов
/ 25 октября 2010

Ваш вопрос подразумевает, что у вас уже есть make-файл для вашего собственного кода.Если это так, то да, вы должны изменить правило для вашего исполняемого файла в этом make-файле.Как указывает Барт ван Инген Шенау, сборочный файл POCO, вероятно, собирал файлы объектов в библиотеки, такие как Poco/Libraries/libPoco.a, поэтому вы должны использовать их вместо того, чтобы пытаться выбрать нужные вам объектные файлы.Например, если сейчас ваше правило гласит:

foo: foo.o bar.o
    g++ -lSomeLibrary $^ -o $@

, вы должны изменить его на

foo: foo.o bar.o
    g++ -lSomeLibrary -LPoco/Libraries -lPoco $^ -o $@

(Вторая часть вашего вопроса: «Что происходит ... Как насчетотдых? "мне непонятно.)

Примечание: Это плохая идея для #include "Poco/Path.h".Это делает ваш код зависимым от структуры каталогов, а это не должно волновать.Гораздо лучше #include "Path.h" и указать компилятору, где его найти: g++ -c -IPoco ....

...