2010-10-25 4 views
8

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

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

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

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

ответ

10

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

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

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

+0

Итак. Файл является статической библиотекой и .so является динамическим/общим? – Seba

+0

@Seba: Да, это правильно. –

+0

Спасибо большое :) – Seba

8

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

foo: foo.o bar.o 
    g++ -lSomeLibrary $^ -o [email protected] 

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

foo: foo.o bar.o 
    g++ -lSomeLibrary -LPoco/Libraries -lPoco $^ -o [email protected] 

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

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

Смежные вопросы