【工具】Makefile

Makefile中的wildcard,notdir,patsubst

patsubst

Makefile中的$@、$^、$<

Makefile中 -I -L -l区别

Makefile中语句的顺序

生成动态库

“undefined reference to“ 问题汇总及解决方法 ------非常非常好的一篇文章

C++的模板为什么要在头文件(.h)中实现?

为什么类的定义应当写在头文件中,从而被多个源文件包含?

linux的各种自带库-lz -lrt -lm -lc都是什么库

lz     压缩库(Z)
lrt    实时库(real time):shm_open系列
lm     数学库(math)
lc     标准C库(C lib)
-dl    显式加载动态库的动态函数库

为什么有的代码必须在头文件中实现才能被链接到,一旦在.cpp中实现就没有办法链接到呢?

s和S是两个不一样的选项,具体可以看man

readelf -s /home/muten/module/TARS/MutenTarsStudy/TC_MySql_Test/util/src/tc_mysql.o 可以看elf文件中的函数的情况

objdump -S ElfFilename  可以验证上面面的readelf看出来的情况

dwarfdump -s ElfFilename

提供一个makefile

CC          = gcc
CXX         = g++
CFLAGS      += -std=c++11 -g -O2 -Wno-deprecated -Wall `mysql_config --cflags --libs`
LD_LIBS = -lpthread -lmysqlclient
LD_OPTS =
PWD := $(shell pwd)
TARS_CPP_UTIL_SRC_DIR = ${PWD}/util/src
TARS_CPP_UTIL_INC_DIR = ${PWD}/util/include

#-----------------------------------------------------------
# util
#-----------------------------------------------------------

TARS_CPP_UTIL_SRC = ${TARS_CPP_UTIL_SRC_DIR}/tc_strptime.cpp \
        ${TARS_CPP_UTIL_SRC_DIR}/tc_ex.cpp\
        ${TARS_CPP_UTIL_SRC_DIR}/tc_base64.cpp\
        ${TARS_CPP_UTIL_SRC_DIR}/tc_common.cpp\
        ${TARS_CPP_UTIL_SRC_DIR}/tc_des.cpp\
        ${TARS_CPP_UTIL_SRC_DIR}/tc_port.cpp\
        ${TARS_CPP_UTIL_SRC_DIR}/tc_mysql.cpp
# TARS_CPP_UTIL_INC是头文件的文件夹
TARS_CPP_UTIL_INC = -I${TARS_CPP_UTIL_INC_DIR}
# patsubst 是替换通配符,patsubst把$(dir)中的变量符合后缀是.c的全部替换成.o
TARS_CPP_UTIL_OBJ = ${patsubst %.cpp, %.o, ${TARS_CPP_UTIL_SRC}}

#-------------------------------------------------------------
# TARS_SQL_TEST 
#-------------------------------------------------------------
TARS_SQL_TEST_SRC = ${PWD}/tars_mysql_test.cpp
TARS_SQL_TEST_INC = ${TARS_CPP_UTIL_INC}\
                   -I${PWD}
TARS_SQL_TEST_OBJ = ${patsubst %.cpp, %.o, ${TARS_SQL_TEST_SRC}}

#----------------------------------------------------------------
# Build Target
#----------------------------------------------------------------

all: TARS_SQL_TEST
.PHONY : all
# $@ 表示目标文件
TARS_SQL_TEST: ${TARS_SQL_TEST_OBJ} ${TARS_CPP_UTIL_OBJ}
        @echo "====================================line = 44 ,start to ld(链接)================================================="
        ${CXX} ${CFLAGS}  ${TARS_SQL_TEST_OBJ} ${TARS_CPP_UTIL_OBJ} -o $@ ${LD_OPTS} ${LD_LIBS} -g `mysql_config --cflags --libs`
        @echo "Compile TARS_SQL_TEST done."

#-----------------------------------------------------------------
# Buile Object
#-----------------------------------------------------------------

${TARS_SQL_TEST_OBJ}:%.o:%.cpp
        @echo "=============line 60 =================Compiling $< ==> $@"
        ${CXX} ${CFLAGS} ${TARS_SQL_TEST_INC} -c $< -o $@


${TARS_CPP_UTIL_OBJ}:%.o:%.cpp
        @echo "=============line 65 ================Compiling  $< ==> $@"
        ${CXX} ${CFLAGS} ${TARS_CPP_UTIL_INC} -c $< -o $@

clean:
        @echo "begin to rm the util and tars_sql_test obj"
        @rm -rf ${TARS_CPP_UTIL_OBJ}
        @rm -rf ${TARS_SQL_TEST_OBJ}
        @echo "Clean object files done."
TOP_SRC_DIR=/home/bnc/zynq/zynq_test/zynq
LIB_NAME?=zynq

CONFIG_DIR =  ${TOP_SRC_DIR}/config
MAIN_DIR=${CUR_DIR}  

INC_DIR= -I${CONFIG_DIR}

TARGET = lib
LIBSRC = ${wildcard  ${CONFIG_DIR}/*.c}
      
LIBOBJ = ${patsubst %.c, %.o, ${LIBSRC}}
OBJS = fpga_cfg.o zynq_pl_ps_comm.o 
CC              =gcc 
CCFLAGS=-g -Wall -fPIC ${INC_DIR}


TARGET_LIB = lib${LIB_NAME}.so

FPGA_CFG_SRC = ${CONFIG_DIR}/fpga_cfg.c
FPGA_CFG_INC = -I${CONFIG_DIR}
FPGA_CFG_OBJ = ${patsubst %.c, %.o, ${FPGA_CFG_SRC}}


ZYNQ_PL_PS_COMM_SRC = ${CONFIG_DIR}/zynq_pl_ps_comm.c
ZYNQ_PL_PS_COMM_INC = -I${CONFIG_DIR}
ZYNQ_PL_PS_COMM_OBJ = ${patsubst %.c, %.o, ${ZYNQ_PL_PS_COMM_SRC}}

TARGET_LIB_SRC = ${CONFIG_DIR}/zynq_pl_ps_comm.c\
                 ${CONFIG_DIR}/fpga_cfg.c
TARGET_LIB_INC = -I${CONFIG_DIR}
TARGET_LIB_OBJ = ${patsubst %.c, %.o, ${TARGET_LIB_SRC}}


all:${TARGET_LIB}
${TARGET_LIB}:${FPGA_CFG_OBJ} ${ZYNQ_PL_PS_COMM_OBJ}
	${CC} -o $@ -shared $^
	cp *.so ../unit_test/


${FPGA_CFG_OBJ}:%.o:%.c
	@echo "=============line 42 =========Compiling $< ==> $@"
	${CC} ${CCFLAGS} -c $< -o $@

${ZYNQ_PL_PS_COMM_OBJ}:%.o:%.c
	@echo "=============line 45 =========Compiling $< ==> $@"
	${CC} ${CCFLAGS} -c $< -o $@


clean:
	@rm -f ${LIBOBJ}
	@echo "Clean object files done."
	@rm -f *~
	@echo "Clean tempreator files done."

	@rm -f ${TARGET}
	@echo "Clean target files done."

	@echo "Clean done."

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值