Search code examples
makefileshared-librariesdynamic-library

Can not create shared object from object files


I have wrote a makefile to compile a dynamic library. However, output .so file does not contains all of the methods.

I have used this Makefile:

CC=g++
CFLAGS=-fPIC -g
LDFLAGS=-shared
SRCDIR=src
SOURCES=$(shell echo $(SRCDIR)/*.cpp)
HEADERS=$(shell echo $(SRCDIR)/*.h)
OBJECTS=$(SOURCES:.cpp=.o)

LIBDIR=lib
INCDIR=include

LIBRARIES=-lboost_filesystem -lboost_system -lopencv_core -lopencv_highgui -lopencv_imgproc
OUT=$(LIBDIR)/libAgeGender.so

all: $(SOURCES) $(HEADERS) $(OUT)

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@ $(LDFLAGS)

$(OUT): $(OBJECTS)
    $(CC) $(CFLAGS) $(OBJECTS) $(LIBRARIES) -o $@ $(LDFLAGS)

clean:
    rm -f $(SRCDIR)/*.o *~ $(SRCDIR)/*~ $(OUT)

Then i executed this command to see functions inside of an .o file.

nm SDaisy.o | grep ' T '
00000000000070d6 T _ZN6SDaisy11convolutionERKN2cv3MatESt6vectorIfSaIfEEi
000000000000933e T _ZN6SDaisy12extractDaisyERKN2cv3MatE
0000000000007498 T _ZN6SDaisy14gaussianFilterERKN2cv3MatEff
000000000000854a T _ZN6SDaisy16smoothHistogramsERN2cv3MatE
000000000000c088 T _fini
0000000000005960 T _init

When we look into shared object, we can't see methods.

$ nm libAgeGender.so | grep ' T '
0000000000000578 T _fini
0000000000000438 T _init

How can i make it correctly?


Solution

  • Use the right variables and functions, and let make handle the compilation of .o files.

    SRCDIR  :=  src
    LIBDIR  :=  lib
    INCDIR  :=  include
    
    SRC :=  $(wildcard $(SRCDIR)/*.cpp)
    OBJ :=  $(SRC:.cpp=.o)
    OUT :=  $(LIBDIR)/libAgeGender.so
    
    CXXFLAGS    :=  -fPIC -g
    LDFLAGS     :=  -shared
    LDLIBS      :=  -lboost_filesystem -lboost_system \
                    -lopencv_core -lopencv_highgui -lopencv_imgproc
    
    all:    $(OUT)
    
    $(OUT): $(OBJ)
        $(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@