Add .so and .a libraries to Makefile

96,405

Solution 1

Lets consider your /usr/local/lib/libYARP_OS.a.

What you can do is, have -L/usr/local/lib/ in your makefile as one of the variables. And then you can have -lYARP_OS appended to the LDLIBS.

-L is for path to the lib and -l is the lib name here libYARP_OS.a will be passed as -lYARP_OS.

On the command line you would do something like: gcc -o main main.c -L/usr/local/lib/ -lYARP_OS. This should give you an idea.

Solution 2

You can either use an -L<path> flag to tell GCC about the location of any library, and then include it with -l<libname>. For example this would be

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

as noted by swair.

Alternatively, you can also supply the full path of the static library and compile directly, like

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

See 'Shared libraries and static libraries' for details.

In your specific case I would add them to the LDLIBS= line.

NB: Be careful about linking order, this is relevant when linking programs together. See 'Link order of libraries' for details. For example:

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

works

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

Also see this similar question: How to link to a static library in C?

Solution 3

Append -lYARP_OS -lYARP_sig -lYARP_math -lYARP_dev -lYARP_name -lYARP_init to LDLIBS.

Warning: the linking order may matter.

Also, be sure that the linker knows that /usr/local/lib is a place where to look for libraries, otherwise instruct it with -L/usr/local/lib (you could add another makefile variable, e.g. LIBPATHS or something similar, to contain the libraries paths).

As a general synopsis, if you have a library libMyLib.a in folder /my/path, the gcc (or g++) can be invoked with the following parameters:

gcc -L/my/path -lMyLib [...]
  • -L is used to include paths where the linker will look for libraries
  • -l is used to link a library, which must be passed without the lib prefix and the extension

This question may be useful for a general understanding of libraries usage in C and C++: How to use Libraries

Share:
96,405
rajat
Author by

rajat

Updated on July 09, 2022

Comments

  • rajat
    rajat almost 2 years

    I have a makefile which looks like this .

    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
    

    I want to add the following paths of static libraries to the makefile .

    /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
    

    how do i go about doing this .