“undefined reference to“ 问题汇总及解决方法 ------非常非常好的一篇文章
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."