无法从目标文件创建共享对象

时间:2014-08-22 13:04:26

标签: makefile shared-libraries dynamic-library

我编写了一个makefile来编译动态库。但是,输出.so文件不包含所有方法。

我使用过这个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)

然后我执行了这个命令来查看.o文件中的函数。

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

当我们研究共享对象时,我们无法看到方法。

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

我怎样才能正确使用?

1 个答案:

答案 0 :(得分:1)

使用正确的变量和函数,让make处理.o文件的编译。

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 $@