linux下静态库和动态库的通用生成模板

                                                                    Makefile文件的编写

################################################################  
#自动将src目录下所有的cpp、cc和c文件编译,生成所有.o文件保存在bin/obj下  
#自动生成静态库和动态库文件到lib目录下  
#Created by hhsun 2018-06-2                
#################################################################
PROJECT_TOP_DIR := $(shell pwd)
PROJECT_SRC_DIR := $(PROJECT_TOP_DIR)/src
PROJECT_INC_DIR := $(PROJECT_TOP_DIR)/inc
PROJECT_LIB_DIR := $(PROJECT_TOP_DIR)/lib
PROJECT_OBJ_DIR := $(PROJECT_TOP_DIR)/obj

COMPILER_DIR :=  /home/iflytek-dyye/toolchain/bin/armv7l-timesys-linux-gnueabi-

DATE := $(shell date '+%y-%m-%d-%H')
CXX := $(COMPILER_DIR)g++
STRIP := $(COMPILER_DIR)strip

LIB_NAME := libmae
AR := $(COMPILER_DIR)ar
SHARED_LIB := $(LIB_NAME).so
STATIC_LIB := $(LIB_NAME).a
TARGETS := $(SHARED_LIB) $(STATIC_LIB)

#CXXFLAGS := -g -Wall -Werror -I$(PROJECT_INC_DIR)
CXXFLAGS := -g -Wall -fPIC -I$(PROJECT_INC_DIR)
#CXXFLAGS := -g -Wall -I$(PROJECT_INC_DIR)
LDFLAG := -L$(PROJECT_LIB_DIR)
ARFLAG := rcs
SOFLAG := -shared -fPIC
 
SRCS :=$(wildcard $(PROJECT_SRC_DIR)/*.cpp $(PROJECT_SRC_DIR)/*.cc $(PROJECT_SRC_DIR)/*.c)
SRCS_NODIR := $(notdir $(SRCS))
PROJECT_OBJ_CPP := $(patsubst %.cpp,%.o,$(SRCS_NODIR))
PROJECT_OBJ_CC := $(patsubst %.cc,%.o,$(PROJECT_OBJ_CPP))
PROJECT_OBJ_C := $(patsubst %.c,%.o,$(PROJECT_OBJ_CC))
PROJECT_ALL_OBJS := $(addprefix $(PROJECT_OBJ_DIR)/, $(PROJECT_OBJ_C))

all:$(TARGETS)
	@echo "-----------------------------------------------------------------------------"
	@echo "Build Completed for $(PROJECT_LIB_DIR)/$(TARGETS): $(TARGETS) build"
	@echo "-----------------------------------------------------------------------------"
$(STATIC_LIB): $(PROJECT_ALL_OBJS)
	$(AR) $(ARFLAG) $(PROJECT_LIB_DIR)/$@ $^
$(SHARED_LIB): $(PROJECT_ALL_OBJS)
	$(CXX) $(SOFLAG) -o $(PROJECT_LIB_DIR)/$@ $^
  
$(PROJECT_OBJ_DIR)/%.o: $(PROJECT_SRC_DIR)/%.cc
	$(CXX) -c $(CXXFLAGS) -o $@ $<
$(PROJECT_OBJ_DIR)/%.o: $(PROJECT_SRC_DIR)/%.cpp
	$(CXX) -c $(CXXFLAGS) -o $@ $<
$(PROJECT_OBJ_DIR)/%.o: $(PROJECT_SRC_DIR)/%.c
	$(CXX) -c $(CXXFLAGS) -o $@ $<
	
.PHONY: clean
clean:
	rm -fr $(PROJECT_OBJ_DIR)/*.o
	rm -fr $(PROJECT_LIB_DIR)/$(TARGETS)

注意:

1、空格及转换字符的影响,拷贝到linux下,需要检查多余的空格字符(每行末尾)

2、24~26行解释如下:

报错1:

iflytek@dyye:/mnt/hgfs/share_16.04bit/MAE_src_test$ make clean && make
rm -fr /mnt/hgfs/share_16.04bit/MAE_src_test/obj/*.o
rm -fr /mnt/hgfs/share_16.04bit/MAE_src_test/lib/libmae.so libmae.a
/home/iflytek-dyye/toolchain/bin/armv7l-timesys-linux-gnueabi-g++ -c -g -Wall -Werror -I/mnt/hgfs/share_16.04bit/MAE_src_test/inc -o /mnt/hgfs/share_16.04bit/MAE_src_test/obj/ivGetFeature.o /mnt/hgfs/share_16.04bit/MAE_src_test/src/ivGetFeature.c
/home/iflytek-dyye/toolchain/bin/armv7l-timesys-linux-gnueabi-g++ -c -g -Wall -Werror -I/mnt/hgfs/share_16.04bit/MAE_src_test/inc -o /mnt/hgfs/share_16.04bit/MAE_src_test/obj/ivGSC.o /mnt/hgfs/share_16.04bit/MAE_src_test/src/ivGSC.c
/mnt/hgfs/share_16.04bit/MAE_src_test/src/ivGSC.c: In function 'int TLRA1D030FD20174915A25BE527DEF3D(PGSC, ivFloat32_GSC)':
/mnt/hgfs/share_16.04bit/MAE_src_test/src/ivGSC.c:477:94: error: operation on 'i' may be undefined [-Werror=sequence-point]
/mnt/hgfs/share_16.04bit/MAE_src_test/src/ivGSC.c:478:94: error: operation on 'i' may be undefined [-Werror=sequence-point]
/mnt/hgfs/share_16.04bit/MAE_src_test/src/ivGSC.c:511:94: error: operation on 'i' may be undefined [-Werror=sequence-point]
/mnt/hgfs/share_16.04bit/MAE_src_test/src/ivGSC.c:512:95: error: operation on 'i' may be undefined [-Werror=sequence-point]
cc1plus: all warnings being treated as errors
Makefile:52: recipe for target '/mnt/hgfs/share_16.04bit/MAE_src_test/obj/ivGSC.o' failed
make: *** [/mnt/hgfs/share_16.04bit/MAE_src_test/obj/ivGSC.o] Error 1

解释:由于24行中编译选项中存在-Werror,导致将警告视作错误。

报错2:

/home/iflytek-dyye/toolchain/bin/../lib/gcc/armv7l-timesys-linux-gnueabi/4.6.3/../../../../armv7l-timesys-linux-gnueabi/bin/ld: /mnt/hgfs/share_16.04bit/MAE_src_test/obj/ivGetFeature.o: relocation R_ARM_MOVW_ABS_NC against `TLR458AED412A3C47C49CAEA581C42BD' can not be used when making a shared object; recompile with -fPIC
/mnt/hgfs/share_16.04bit/MAE_src_test/obj/ivGetFeature.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
Makefile:45: recipe for target 'libmae.so' failed
make: *** [libmae.so] Error 1
解释:26行缺少-fPIC,增加即可。

Makefile编写学习:

1、伪目标的作用:https://www.cnblogs.com/hnrainll/archive/2011/04/12/2014082.html;

2、Makefile中的命令前缀作用:链接的2.3小节 https://www.cnblogs.com/wang_yb/p/3990952.html;

3、常用函数的查询:https://blog.csdn.net/yangxuan0261/article/details/52060582;

 

4、gcc -MM kvm_main.c  

-MM作用是查看kvm_main.c的依赖关系

输出:kvm_main.o: kvm_main.c iodev.h coalesced_mmio.h async_pf.h;

5、自动变量

 

Makefile 中很多时候通过自动变量来简化书写, 各个自动变量的含义如下:

自动变量

含义

$@目标集合
$%当目标是函数库文件时, 表示其中的目标文件名
$<第一个依赖目标. 如果依赖目标是多个, 逐个表示依赖目标
$?比目标新的依赖目标的集合
$^所有依赖目标的集合, 会去除重复的依赖目标
$+所有依赖目标的集合, 不会去除重复的依赖目标
$*这个是GNU make特有的, 其它的make不一定支持

试试

6、gcc选项含义:

CFLAGS、CXXFLAGS、LDFLAGS与LIBS:https://blog.csdn.net/soaringlee_fighting/article/details/65448010

7、gcc编译常用选项中     -Werror:它要求gcc将所有的警告当成错误进行处理;

                                     -fPIC选项:PIC指Position Independent Code。共享库要求有此选项,以便实现动态连接

                                                        http://blog.sina.com.cn/s/blog_54f82cc201011op1.html

                                       ARFLAG := rcs:https://www.cnblogs.com/androidme/archive/2013/02/19/2917220.html

                                        -Dmacro:相当于C语言中的#define marcro宏定义

8、$(MAKE):就是预设的 make 这个命令的名称(或者路径),https://www.cnblogs.com/nosadness/p/5136560.html

                                    distclean:

                                                           $(MAKE) -C gbuni clean    

                                    进入gbuni目录进行make clean

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值