main.cpp源文件:包含入口函数 int main(),该源文件中添加了“func.h”头文件,在入口函数中调用func()函数。 func函数中在func.cpp中定义,在func.h中原型声明。

编写Makefile文件 1)定义变量 首先定义SOURCE,OBJS和TARGET变量,用于指代我们项目中的源文件、目标文件和可执行文件。 2) 设置编译参数 CC:配置编译器为g++, LIBS:需要调用的链接库(-l开头,去掉lib和.so。例:对 libopencv_core.so链接库的调用要写作:-lopencv_core), LDFLAGS:链接库的路径(-L开头), INCLUDE:头文件的路径。 3)链接生成 此步骤生成可执行文件(ELF),链接需要用到目标文件,由下一步产生 4)编译 此步骤生成目标文件(.o) 5)清理 此步骤清理可执行文件和所有的目标文件

#######################

Makefile

#######################

source object target

SOURCE := main.cpp func.cpp OBJS := main.o func.o TARGET := main

compile and lib parameter

CC := g++ LIBS := LDFLAGS := -L. DEFINES := INCLUDE := -I. CFLAGS := CXXFLAGS:=

link

#$(TARGET):$(OBJS) $(CC) -o $@ $^

compile

#$(OBJS):$(SOURCE) $(CC) -c main.cpp -o main.o $(CC) -c func.cpp -o func.o

clean

clean: rm -fr *.o rm -fr $(TARGET)

#将上述Makefile中的:

link

#$(TARGET):$(OBJS) $(CC) -o $@ $^

compile

#$(OBJS):$(SOURCE) $(CC) -c main.cpp -o main.o $(CC) -c func.cpp -o func.o

#也可以修改为: all: $(CC) -o $(TARGET) $(SOURCE)

将func.cpp源文件制作成动态链接库libfunc.so,然后调用该动态库对main.cpp进行编译链接。

#######################

Makefile 动态链接库的生成

#######################

compile and lib parameter

CC := g++ LIBS := LDFLAGS := DEFINES := INCLUDE := -I. CFLAGS := CXXFLAGS:=

link parameter

LIB := libfunc.so

#link $(LIB):func.o $(CC) -shared -o -fPIC -o $@ $^ #compile func.o:func.cpp $(CC) -c -fPIC $^ -o $@

clean

clean: rm -fr *.o

执行make命令之后,就可以在当前目录生成libfunc.so的动态链接库了。 注意:动态链接库必须“以lib开头,以.so结尾”。 注:缺少 -fPIC错误

动态链接库的调用:如果并没有提供func.cpp和func.o,只是提供了libfunc.so这个链接库,我们如何生成可执行文件呢?

Makefile如下: 1)编译的时候需要通过INCLUDE指明头文件的路径 2)链接的时候需要通过LDFLAGS 和 LIBS指明动态库的路径和名称。这里需要注意的是,指明动态库名称时需要“掐头去尾”,例:我们需要用到 libfunc.so库,LIBS必须定义为 -lfunc 。 3)执行的时候,需要把libfunc.so动态库拷贝到系统环境变量包含的路径下(比如/lib或/usr/lib),这样程序在运行时才能调用到动态库。

#######################

Makefile

#######################

target

TARGET := main

compile and lib parameter

CC := g++ LDFLAGS := -L/path/to/libfunc.so LIBS := -lfunc DEFINES := INCLUDE := -I/path/to/func.h CFLAGS := CXXFLAGS:=

link

$(TARGET):main.o $(CC) -o $@ $^ $(LDFLAGS) $(LI

#compile main.o:main.cpp $(CC) $(INCLUDE) -c $^crm -fr $(TARGET)

clean: rm -fr *.o rm -fr $(TARGET)

静态链接库的生成。将func.cpp源文件制作成静态链接库func.a,然后调用该静态库对main.cpp进行编译链接。执行make命令之后,就可以在当前目录生成func.a的静态链接库了

#######################

Makefile

#######################

compile and lib parameter

CC := g++ LIBS := LDFLAGS := DEFINES := INCLUDE := -I. CFLAGS := CXXFLAGS:=

link parameter

AR := ar LIB := func.a

#link $(LIB):func.o $(AR) -r $@ $^ #compile func.o:func.cpp $(CC) -c $^ -o $@

clean

clean: rm -fr *.o

静态链接库的调用 Makefile如下: 1)编译的时候需要通过INCLUDE指明头文件的路径 2)链接的时候需要通过LDFLAGS 和 LIBS指明静态库的路径和名称。这里不需要像动态库那样“掐头去尾”,直接写作func.a即可。 3)执行的时候,不需要拷贝func.a至环境变量包含的路径,直接执行即可。

#######################

Makefile

#######################

target

TARGET := main

compile and lib parameter

CC := g++ LDFLAGS := -L. LIBS := func.a DEFINES := INCLUDE := -I. CFLAGS := CXXFLAGS:=

link

$(TARGET):main.o $(CC) -o $@ $^ $(LIBS) #compile main.o:main.cpp $(CC) -c $^ -o $@

clean

clean: rm -fr *.o rm -fr $(TARGET)