【Linux】在makefile中,引入依赖库和路径的方法

一、背景

在linux中,调试阿里云SDK,需要使用到libcurl库进行文件下载操作,现需要在阿里SDK中引入curl.h以及库文件。

二、需求分析

linux中,编译时库文件引入,指定路径,指定引入库。 

三、介绍

3.1linux编译

        编译使用makefile,因此在项目的makefile文件中操作。

3.2库文件引入

        已知需要libcurl.so库,可能还需要其配套的其他的库文件。

3.3指定路径

        在命令中使用-L指定编译的路径。

3.4指定引入库

        在命令中使用-l(小写的L)加上库名字(不含后缀),如libcurl.so,库名字为curl,则写为-lcurl。

三、构建关键代码


LDFLAGS=-L/home/Evenurs/f1c100s/bluetooth/f1c100s/tina/out/c200s-F1C200s/staging_dir/target/usr/lib -lcurl -lnghttp2 -lssl -lcrypto

 四、源码

# 若使用交叉编译,需要修改CC和AR
#CC := gcc
CC = /home/Evenurs/f100s_tina/main/f1c100s/tina/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-arm9-musl/toolchain/bin/arm-openwrt-linux-gcc
AR := ar
BLD_CFLAGS := $(CFLAGS) -Wall 
BLD_CFLAGS += -Os -fPIC

LDFLAGS=-L/home/Evenurs/f1c100s/bluetooth/f1c100s/tina/out/c200s-F1C200s/staging_dir/target/usr/lib -lcurl -lnghttp2 -lssl -lcrypto

# 路径定义
TOP_DIR := $(shell pwd)
DEMOS_DIR := demos
OUT_DIR := output
LIB_DIR := output/lib
INCLUDE_DIR := output/include
NOPOLL_DIR := external/nopoll/
BLD_LDFLAGS := $(LDFLAGS) -lpthread

# 设置默认链接路径为$(LIB_DIR)
LIB_LDFLAGS := -L $(LIB_DIR) -Wl,-rpath,$(LIB_DIR)

# 使用安全隧道/远程登录功能,才编译外部库nopoll
ra_exist = $(shell if [ -d $(NOPOLL_DIR) ]; then echo "true"; else echo "false"; fi)
ifeq ("$(ra_exist)", "true")
NOPOLL_SRC := $(shell find $(NOPOLL_DIR) -name "*.c")
NOPOLL_FILES := $(NOPOLL_SRC:.c=.o)
NOPOLL_FILES := $(addprefix $(OUT_DIR)/,$(NOPOLL_FILES))
NOPOLL_LIB := libnopoll
LIB_LDFLAGS += -lnopoll
STA_LIB_LDFLAGS += $(LIB_DIR)/libnopoll.a 
endif

# LinkSDK源码文件
HDR_DIR := $(shell find . -type d \( ! -name demos \))
BLD_CFLAGS += $(addprefix -I,$(HDR_DIR))
SRC_FILES := $(shell find . -not -path "*/demos/*.c" -not -path "*/nopoll/*" -name "*.c")
OBJ_FILES := $(SRC_FILES:.c=.o)
OBJ_FILES := $(addprefix $(OUT_DIR)/,$(OBJ_FILES))
AIOT_LIB := libaiot

DYN_LIB_LDFLAGS := -laiot
DYN_LIB_LDFLAGS += $(LIB_LDFLAGS)
STA_LIB_LDFLAGS := $(LIB_DIR)/libaiot.a

# demo及头文件输出
PROG_TARGET := $(subst _,-,$(patsubst %.c,%,$(wildcard demos/*_demo.c)))
INCLUDE_SRC := $(shell find . -not -path "*/output/*.h" -name "aiot_*_api.h")

Q := @
all: prepare $(NOPOLL_LIB) $(AIOT_LIB) $(PROG_TARGET)

prepare:
	$(Q)mkdir -p $(OUT_DIR)
	$(Q)mkdir -p $(LIB_DIR)
	$(Q)mkdir -p $(INCLUDE_DIR)

$(NOPOLL_LIB): $(NOPOLL_FILES)
	$(Q)echo "+ Linking $(LIB_DIR)/$@.so ..."
	$(Q)$(CC) -fPIC -shared -o $(LIB_DIR)/$@.so $^
	$(Q)echo "+ Linking $(LIB_DIR)/$@.a ..."
	$(Q)$(AR) -cr $(LIB_DIR)/$@.a $^

$(AIOT_LIB): $(OBJ_FILES)
	$(Q)cp $(INCLUDE_SRC) $(INCLUDE_DIR)
	$(Q)echo "+ Linking $(LIB_DIR)/$@.so ..."
	$(Q)$(CC) -fPIC -shared -o $(LIB_DIR)/$@.so $^ $(LIB_LDFLAGS) $(BLD_LDFLAGS)
	$(Q)echo "+ Linking $(LIB_DIR)/$@.a ..."
	$(Q)$(AR) -cr $(LIB_DIR)/$@.a $^

$(PROG_TARGET): $(NOPOLL_lib) $(AIOT_LIB)
	$(Q)echo "+ Linking $(OUT_DIR)/$(notdir $@) ..."
	$(Q)mkdir -p $(dir $@)
	$(Q)if [ $(notdir $@) = "remote-access-basic-demo" ] \
		|| [ $(notdir $@) = "tunnel-basic-demo" ] ;then \
		$(CC) -o $@ \
			$(patsubst $(OUT_DIR)/%,%,$(addsuffix .c,$(subst $(notdir $@),$(subst -,_,$(notdir $@)),$@))) \
			$(BLD_CFLAGS) $(DYN_LIB_LDFLAGS) $(BLD_LDFLAGS); \
	else \
		$(CC) -o $@ \
			$(patsubst $(OUT_DIR)/%,%,$(addsuffix .c,$(subst $(notdir $@),$(subst -,_,$(notdir $@)),$@))) \
			$(BLD_CFLAGS) $(STA_LIB_LDFLAGS) $(BLD_LDFLAGS); \
	fi

	$(Q)mv $@ $(OUT_DIR)

$(OUT_DIR)/%.o: %.c
	$(Q)echo ": Compiling $< ..."
	$(Q)mkdir -p $(OUT_DIR)/$(dir $<)
	$(Q)$(CC) -o $@ -c $< $(BLD_CFLAGS)

clean:
	$(Q)rm -rf $(OUT_DIR)

五、总结

通过需求分析和已知信息,可以很好的得出解决问题的方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值