Добавьте библиотеки .so и .a в Makefile

У меня есть make-файл, который выглядит так.

DEFINES=-std=c++0x
INCS_GTK=-I/usr/include/gtk-2.0 -I/usr/include/glib-2.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/gtk-2.0/gdk -I/usr/include/pango-1.0 -I/usr/lib/gtk-2.0/include -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include
INCS=-I/usr/include/freetype2 -I/usr/include/mysql -Iframeworks ${INCS_GTK}
LDLIBS=-lconfig++ -lcxcore -lcv -lGL -lGLU -lglut -lhighgui -lSDL -lftgl -lueye_api -lboost_filesystem -lboost_system -lann -lpthread -lflycapture -lglog -lmysqlpp -lmysqlclient -lunittest++
DEBUG=-g -pg
WARNINGS=-Wall -Wextra -pedantic -Wno-long-long #-O3 -Weffc++
BUILDDIR=build
BINDIR=dist

MAINCXX=${shell find -name '*.cxx'}
TARGETS=${MAINCXX:%.cxx=%}
CXXFLAGS=${DEBUG} ${WARNINGS} ${DEFINES} ${INCS}
LDFLAGS=${DEBUG} ${WARNINGS} ${DEFINES}
include IDEconfigs/Makefile/generic.mk

Я хочу добавить в make-файл следующие пути статических библиотек.

/usr/local/lib/libYARP_OS.a  /usr/local/lib/libYARP_sig.a  /usr/local/lib/libYARP_math.a  /usr/local/lib/libYARP_dev.a  /usr/local/lib/libYARP_name.a  /usr/local/lib/libYARP_init.a

как мне это сделать.


person rajat    schedule 21.08.2012    source источник
comment
это не может быть весь make-файл, но я бы предложил добавить в LDLIBS   -  person BЈовић    schedule 21.08.2012
comment
это единственный make-файл, который есть в проекте.   -  person rajat    schedule 21.08.2012


Ответы (4)


Давайте рассмотрим ваш /usr/local/lib/libYARP_OS.a.

Что вы можете сделать, так это указать -L/usr/local/lib/ в вашем make-файле в качестве одной из переменных. И тогда вы можете добавить -lYARP_OS к LDLIBS.

-L - это путь к библиотеке, а -l - имя библиотеки, здесь libYARP_OS.a будет передано как -lYARP_OS.

В командной строке введите что-то вроде: gcc -o main main.c -L/usr/local/lib/ -lYARP_OS. Это должно дать вам представление.

person Swair    schedule 21.08.2012
comment
Как я могу добавить это в make-файл? - person Nam Vu; 20.10.2015
comment
Спасибо новичку C ++, который только что погрузился в этот мир. - person Christophe Geers; 18.08.2019

Вы можете использовать флаг -L<path>, чтобы сообщить GCC о местонахождении любой библиотеки, а затем включить его с -l<libname>. Например, это будет

$ gcc -o main main.c -L/usr/local/lib/ -lYARP_SO

как заметил swair.

В качестве альтернативы вы также можете указать полный путь к статической библиотеке и скомпилировать напрямую, например

$ gcc -o main main.c /usr/local/lib/libYARP_OS.a

Подробнее см. «Общие библиотеки и статические библиотеки».

В вашем конкретном случае я бы добавил их в строку LDLIBS=.

NB: будьте осторожны с порядком связывания, это актуально при связывании программ вместе. Подробнее см. «Порядок связывания библиотек». Например:

$ gcc -Wall calc.c -lm -o calc   (correct order)

работает

$ cc -Wall -lm calc.c -o calc    (incorrect order)
main.o: In function `main':
main.o(.text+0xf): undefined reference to `sqrt'

Также см. Этот аналогичный вопрос: Как создать ссылку на статическую библиотеку на C?

person Tim    schedule 21.08.2012
comment
так что я могу просто сделать: LDLIBS = -lconfig ++ -lcxcore -lcv -lGL -lGLU -lglut -lhighgui -lSDL -lftgl -lueye_api -lboost_filesystem -lboost_system -lann /usr/local/lib/lib.ArP_ /libYARP_sig.a /usr/local/lib/libYARP_math.a /usr/local/lib/libYARP_dev.a /usr/local/lib/libYARP_name.a /usr/local/lib/libYARP_init.a - person rajat; 21.08.2012
comment
Это действительно может сработать, но это также может зависеть от взаимозависимостей между объектами AFAIK. Это сработало? - person Tim; 30.08.2012

Добавьте -lYARP_OS -lYARP_sig -lYARP_math -lYARP_dev -lYARP_name -lYARP_init в LDLIBS.

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

Также убедитесь, что компоновщик знает, что /usr/local/lib - это место, где искать библиотеки, в противном случае проинструктируйте его с помощью -L/usr/local/lib (вы можете добавить другую переменную makefile, например LIBPATHS или что-то подобное, чтобы содержать пути к библиотекам).

В общем, если у вас есть библиотека libMyLib.a в папке /my/path, gcc (или g++) можно вызвать со следующими параметрами:

gcc -L/my/path -lMyLib [...]
  • -L используется для включения путей, по которым компоновщик будет искать библиотеки.
  • -l используется для компоновки библиотеки, которую необходимо передавать без префикса lib и расширения

Этот вопрос может быть полезен для общего понимания использования библиотек в C и C ++: Как использовать библиотеки

person Vincenzo Pii    schedule 21.08.2012

В Makefile добавьте вот так

USER_LIBS = -lYARP_OS -lYARP_sig -lYARP_math -lYARP_dev -lYARP_name -lYARP_init

Это свяжет необходимые библиотеки

person pauljames840    schedule 05.05.2017