如何编写含系统头文件的Makefile,解决头文件缺失、openssl函数未识别问题
问题描述
我参考相关技术文档尝试编写Makefile,由于存在多个*.c文件需要编译,我对示例代码做了少量调整。项目层级结构如下:
/coap Makefile /src /src /coap /imc *.h files /src *.c files /system /imc client.h /src client.c **makefile** /files sdk.sh
我编写的第一个Makefile运行正常,但问题出在上述加粗标识的第二个Makefile上。我修改后的Makefile内容如下:
program_NAME := coap program_C_SRCS += \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/address.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/async.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/block.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/coap_asn1.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/coap_cache.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/coap_debug.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/coap_event.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/coap_gnutls.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/coap_hashkey.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/coap_io.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/coap_mbedtls.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/coap_notls.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/coap_openssl.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/coap_prng.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/coap_session.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/coap_tcp.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/coap_time.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/coap_tinydtls.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/encode.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/mem.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/net.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/option.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/pdu.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/resource.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/str.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/subscribe.c \ /home/iat2/Projects/XXXX/package/coap/src/src/coap/src/uri.c program_C_OBJS := ${program_C_SRCS:.c=.o} program_OBJS := $(program_C_OBJS) program_INCLUDE_DIRS :=/home/iat2/Projects/XXXX/package/coap/src/src/coap/imc program_LIBRARY_DIRS := program_LIBRARIES := router CFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir)) LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir)) LDFLAGS += $(foreach library,$(program_LIBRARIES),-l$(library)) .PHONY: all clean distclean all: $(program_NAME) $(program_NAME): $(program_OBJS) $(LINK.cc) $(program_OBJS) -o $(program_NAME) clean: @- $(RM) $(program_NAME) @- $(RM) $(program_OBJS) distclean: clean
编译时报错如下:
fatal error: sys/random.h: No such file or directory #include <sys/random.h>
同时coap_openssl.c文件中使用的部分openssl函数也无法被识别,请问该如何解决上述问题?
解决方案
- 修复
sys/random.h找不到的问题sys/random.h是Linux内核3.17版本之后才新增的头文件,你可以先通过uname -r命令查看当前编译环境的内核版本:- 如果内核版本低于3.17,可以在CFLAGS中添加
-DHAVE_SYS_RANDOM_H=0参数,让CoAP库跳过该头文件的引用,改用其他随机数生成接口;也可以将内核升级到3.17及以上版本。 - 如果是交叉编译场景,需要确认你使用的交叉编译工具链的glibc版本是否包含该头文件,缺失的话更换适配的工具链即可。
- 如果内核版本低于3.17,可以在CFLAGS中添加
- 修复OpenSSL函数无法识别的问题
你当前的Makefile没有配置OpenSSL的头文件路径和链接依赖,按以下步骤补充配置即可:- 先安装OpenSSL开发包:Debian/Ubuntu系统安装
libssl-dev,RHEL/CentOS系统安装openssl-devel。 - 在
program_INCLUDE_DIRS中添加OpenSSL的头文件路径,在program_LIBRARIES中添加OpenSSL的依赖库,参考修改如下:
program_INCLUDE_DIRS :=/home/iat2/Projects/XXXX/package/coap/src/src/coap/imc \ $(shell pkg-config --cflags-only-I openssl | sed 's/-I//g') program_LIBRARIES := router ssl crypto - 先安装OpenSSL开发包:Debian/Ubuntu系统安装
- 优化建议:你当前的Makefile使用绝对路径定义源文件,可改为相对路径,避免项目路径变更后需要重新修改配置。
内容的提问来源于stack exchange,提问作者FaruK
相关产品推荐
相关产品推荐

