说明
使用到相应静态库,需要编译,记录下来,方便自己翻阅,也期望帮助到有需要的人。
构建Makefile
#编译curl-7.82
./configure --disable-manual CFLAGS="-fPIC" --prefix=/dev_tools/usr/local/curl-7.82 --with-openssl=/dev_tools/usr/local/openssl-1.1.q --with-zlib=/dev_tools/usr/local/zlib
# 其他编译见 https://editor.csdn.net/md/?articleId=135241692
目的
编译一个动态库libluacurl.so,导出函数。
遇到问题
1.正确的库链接顺序 -llua -lcurl -lssl -lcrypto -lz -ldl -pthread;使用其他顺序则dlopen函数调用失败,返回0x0
2.libcurl编译成静态库:
<1> 从libluacurl.so 导出的函数,在测试main.cpp中可以正常。但从正式的程序中,总是内存泄漏
通过debug cordump文件显示 0x00007f93973e57a0 in lh_insert () from /lib64/libcrypto.so.10。这说明没有加载指定的-lssl -lcrypto静态库,而是加载系统自带的动态库。
解决办法:
1.libcurl编译成动态库。
2.配置export LD_LIBRARY_PATH=/appliance/libs/plus/extmodule:$LD_LIBRARY_PATH:/usr/local/lib/
/appliance/libs/plus/extmodule 存放libcurl的地方。指定了优先加载的,配置前,配置后,可以通过ldd libluacurl.so查看比较得出。
可能原因:
libssl libcrypto这两个库的问题,libcurl依赖他们,但最终ld链接的时,程序加载到系统环境下的libssl libcrypto,并未加载指定的静态libssl libcrypto。
如有在makefile 中导致的问题,请给我留言,谢谢!
makefile
USER_HOME=${HOME}
ROOT_HOME=$(shell dirname $(shell readlink -f pwd))
ROOT_NAME=$(shell dirname $(shell readlink -f pwd) | awk -F '/' '{ print $$NF }')
OBJS_PATH=$(USER_HOME)/usrlibs/objs/$(ROOT_NAME)
LIBS_PATH=$(USER_HOME)/usrlibs/libs
BINS_PATH=$(ROOT_HOME)/bin
SRCS_PATH=$(ROOT_HOME)/src
LUA5_LIB_PATH=-L/dev_tools/lua-5.3.5/src
CURL_LIB_PATH=-L/dev_tools/usr/local/curl-7.82/lib
SSLX_LIB_PATH=-L/dev_tools/usr/local/openssl-1.1.q/lib
ZLIB_LIB_PATH=-L/dev_tools/usr/local/zlib/lib
INPUT_LIBS_PATH= $(LUA5_LIB_PATH) $(CURL_LIB_PATH) $(SSLX_LIB_PATH) $(ZLIB_LIB_PATH)
INPUT_LIBS_NAME= -llua -lcurl -lssl -lcrypto -lz -ldl -pthread
#INPUT_LIBS_NAME= -llua -lcurl -lz -lssl -lcrypto -ldl -lcurl -lpthread
$(shell if [ ! -d $(OBJS_PATH) ]; then mkdir -p $(OBJS_PATH); fi)
$(shell if [ ! -d $(LIBS_PATH) ]; then mkdir -p $(LIBS_PATH); fi)
PLUS_PATH=$(shell dirname $(shell dirname $(shell readlink -f pwd)))
CC = g++ -g -Wall -D_THREAD_SAFE -DMY_MULTITHREAD
PLUS_INCLUDE = -I$(PLUS_PATH)/libcomm/src
CURL_INCLUDE = -I/dev_tools/usr/local/curl-7.82/include
LUA5_INCLUDE = -I/dev_tools/lua-5.3.5/src
PATH_INCLUDE = $(CURL_INCLUDE) $(LUA5_INCLUDE)
SRCS= $(foreach x,$(SRCS_PATH),$(wildcard $(addprefix $(x)/*,.cpp .S)))
SRCC= $(foreach x,$(SRCS_PATH),$(wildcard $(addprefix $(x)/*,.c .S)))
OBJX = $(addprefix $(OBJS_PATH)/, $(addsuffix .o,$(notdir $(basename $(SRCS)))))
OBJS = $(OBJX) $(addprefix $(OBJS_PATH)/, $(addsuffix .o,$(notdir $(basename $(SRCC)))))
TARGET_SO=$(BINS_PATH)/libluacurl.so
TARGET_A=$(LIBS_PATH)/libluacurl.a
TARGET=$(TARGET_SO) $(TARGET_A)
all: $(TARGET)
install: $(TARGET)
@cp -f *.h ../include/
$(TARGET): $(OBJS) makefile
$(CC) -g -shared -o $(TARGET_SO) $(OBJS) $(INPUT_LIBS_PATH) $(INPUT_LIBS_NAME)
ar -rs $(TARGET_A) $(OBJS)
clean:
@rm -f $(OBJS_PATH)/*.o
@rm -f $(TARGET_SO)
@rm -f $(TARGET_A)
$(OBJS_PATH)/%.o:$(SRCS_PATH)/%.cpp
$(CC) -fPIC $(PATH_INCLUDE) $ -c $< -o $@
$(OBJS_PATH)/%.o:$(SRCS_PATH)/%.c
$(CC) -fPIC $(PATH_INCLUDE) $ -c $< -o $@