You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写含系统头文件的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版本是否包含该头文件,缺失的话更换适配的工具链即可。
  • 修复OpenSSL函数无法识别的问题
    你当前的Makefile没有配置OpenSSL的头文件路径和链接依赖,按以下步骤补充配置即可:
    1. 先安装OpenSSL开发包:Debian/Ubuntu系统安装libssl-dev,RHEL/CentOS系统安装openssl-devel。
    2. 在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
    
  • 优化建议:你当前的Makefile使用绝对路径定义源文件,可改为相对路径,避免项目路径变更后需要重新修改配置。

内容的提问来源于stack exchange,提问作者FaruK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 02:36:03