找回密码
 立即注册
查看: 717|回复: 11

分享SDCC\IAR下.lib生成与使用经验

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2940

积分

荣誉版主

无情的代码机器

积分
2940
发表于 2024-12-3 16:43:52 | 显示全部楼层 |阅读模式

分享SDCC\IAR下.lib生成与使用经验

1. IAR下生成.lib

image.png

image.png

只需要修改如图选项即可。菜单-》Project-》Make

image.png

2. IAR下使用.lib

和keil操作一致,直接添加进工程即可

image.png

3 SDCC生成.lib

调用 sdar生成.lib

Usage: sdar [emulation options] [-]{dmpqrstx}[abcDfilMNoOPsSTuvV] [--plugin <name>] [member-name] [count] archive-file file...
       sdar -M [<mri-script]
 commands:
  d            - delete file(s) from the archive
  m[ab]        - move file(s) in the archive
  p            - print file(s) found in the archive
  q[f]         - quick append file(s) to the archive
  r[ab][f][u]  - replace existing or insert new file(s) into the archive
  s            - act as ranlib
  t[O][v]      - display contents of the archive
  x[o]         - extract file(s) from the archive
 command specific modifiers:
  [a]          - put file(s) after [member-name]
  [b]          - put file(s) before [member-name] (same as [i])
  [D]          - use zero for timestamps and uids/gids
  [U]          - use actual timestamps and uids/gids (default)
  [N]          - use instance [count] of name
  [f]          - truncate inserted file names
  [P]          - use full path names when matching
  [o]          - preserve original dates
  [O]          - display offsets of files in the archive
  [u]          - only replace files that are newer than current archive contents
 generic modifiers:
  [c]          - do not warn if the library had to be created
  [s]          - create an archive index (cf. ranlib)
  [l <text> ]  - specify the dependencies of this library
  [S]          - do not build a symbol table
  [T]          - deprecated, use --thin instead
  [v]          - be verbose
  [V]          - display the version number
  @<file>      - read options from <file>
  --target=BFDNAME - specify the target object format as BFDNAME
  --output=DIRNAME - specify the output directory for extraction operations
  --record-libdeps=<text> - specify the dependencies of this library
  --thin       - make a thin archive
 optional:
  --plugin <p> - load the specified plugin
 emulation options:
  No emulation specific options
sdar: supported targets: asxxxx srec symbolsrec verilog tekhex binary ihex plugin

Makefile如下:

ROOT_DIR := ../
TARGET = add
BUILD_DIR =  ./build/

#obj2占位符抵消../
BUILD_OBJ_DIR =  ./build/obj/obj2/
PREFIX = 

CC = $(PREFIX)sdcc 
AS = $(PREFIX)sdas8051 #sdc51


RM = -rm -rf
MAKE = make 

MCU_MODEL = -mmcs51
MODEL  = --model-large
CODE_SIZE = --code-size 65536  # 64KB 的 Flash 存储器
IRAM_SIZE = --iram-size 2048    # 2KB 的内部 SRAM
XRAM_SIZE = --xram-size 32768   # 32KB 的内部扩展 RAM

AS_DEFS = 
C_DEFS = 

# includes,头文件必须包含在以下文件中
AS_INCLUDES = 
INC_PATHS =  \
-I$(ROOT_DIR)App \
-I$(ROOT_DIR)User \
-I$(ROOT_DIR)inc

# libraries

USER_SRC =  $(ROOT_DIR)Library

C_SOURCES := $(USER_SRC)/add.c

 # 对象文件
C_OBJECTS := $(patsubst %.c, $(BUILD_OBJ_DIR)/%.rel, $(C_SOURCES))

# 最终目标文件
ALL_OBJECTS := $(C_OBJECTS) 

# 规则
.PHONY: all clean mk

# 主要目标
all: $(BUILD_DIR)/$(TARGET).lib

# 清理
clean:
    -rm -rf $(BUILD_DIR)/*

# 编译
$(BUILD_OBJ_DIR)/%.rel: %.c
    @echo "Compiling $< into $(dir $@)"
    mkdir -p $(dir $@) | $(CC) -c -o $@ $(MCU_MODEL) $(INC_PATHS) $(MODEL) --out-fmt-ihx --debug $<

# 链接生成
$(BUILD_DIR)/$(TARGET).lib: $(ALL_OBJECTS)
    @echo "Compiling $^ into $(dir $@)"
    mkdir -p $(dir $@) | sdar rv $@ $^


# 删除构建目录
clean-build-dir:
    rm -rf $(BUILD_DIR)

4 SDCC使用.lib

通过 LDFLAGS调用lib,-L包含lib库目录,-l链接指定lib

Makefile语法如下:

ROOT_DIR := ../
TARGET = downloadfile
BUILD_DIR =  ./build/

#obj2占位符抵消../
BUILD_OBJ_DIR =  ./build/obj/obj2/
PREFIX = 

CC = $(PREFIX)sdcc 
AS = $(PREFIX)sdas8051 #sdc51


RM = -rm -rf
MAKE = make 

MCU_MODEL = -mmcs51
MODEL  = --model-large
CODE_SIZE = --code-size 65536  # 64KB 的 Flash 存储器
IRAM_SIZE = --iram-size 2048    # 2KB 的内部 SRAM
XRAM_SIZE = --xram-size 32768   # 32KB 的内部扩展 RAM


AS_DEFS = 
C_DEFS = 

# includes,头文件必须包含在以下文件中
AS_INCLUDES = 
INC_PATHS =  \
-I$(ROOT_DIR)Driver/inc \
-I$(ROOT_DIR)User \
-I$(ROOT_DIR)Library

# libraries
LIBS = -ladd
LIBDIRS = -L../SDCC-lib/build

LIB_SRC = 
USER_SRC =  $(ROOT_DIR)User
C_SOURCES := $(wildcard   $(ROOT_DIR)Driver/src/*.c  $(ROOT_DIR)Driver/isr/*.c    $(ROOT_DIR)App/src/*.c)

C_SOURCES += $(USER_SRC)/Main.c
ASM_SOURCES = 
 # 对象文件
C_OBJECTS := $(patsubst %.c, $(BUILD_OBJ_DIR)/%.rel, $(C_SOURCES))
ASM_OBJECTS := $(patsubst %.asm, $(BUILD_OBJ_DIR)/%.rel, $(ASM_SOURCES))

# 最终目标文件
ALL_OBJECTS := $(C_OBJECTS) $(ASM_OBJECTS)


# 链接选项
LDFLAGS =  $(LIBDIRS) $(LIBS) # 删除未使用的段

# 规则
.PHONY: all clean mk

# 主要目标
all: $(BUILD_DIR)/$(TARGET).hex

# 清理
clean:
    -rm -rf $(BUILD_DIR)/*
# 编译规则
$(BUILD_OBJ_DIR)/%.rel: %.c
    @echo "Compiling $< into $(dir $@)"
    mkdir -p $(dir $@) | $(CC) -c -o $@ $(MCU_MODEL) $(INC_PATHS) $(MODEL) --out-fmt-ihx --debug $<

$(BUILD_OBJ_DIR)/%.rel: %.asm
    @echo "Compiling $< into $(dir $@)"
    mkdir -p $(dir $@) | $(AS) -o $(INC_PATHS) $@ $<

# 链接规则
$(BUILD_DIR)/$(TARGET).hex: $(ALL_OBJECTS)
    @echo "Compiling $^ into $(dir $@)"
    mkdir -p $(dir $@) | $(CC) -o $@ $(MCU_MODEL) $(INC_PATHS) $(MODEL) $(CODE_SIZE) $(IRAM_SIZE) $(XRAM_SIZE) $(LDFLAGS) --out-fmt-ihx $^


# 删除构建目录
clean-build-dir:
    rm -rf $(BUILD_DIR)

5. 工程文件

upload 附件:Project.zip

三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2025-05-02 08:15:40
已绑定手机

13

主题

1257

回帖

2975

积分

金牌会员

积分
2975
发表于 2024-12-3 17:28:01 | 显示全部楼层
请问SDCC\IAR生成的lib和keil生成的lib通用吗?

点评

试了没,不支持吧  详情 回复 发表于 2024-12-3 19:36
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:267
  • 最近打卡:2025-05-02 09:13:02

4

主题

29

回帖

510

积分

高级会员

积分
510
发表于 2024-12-3 19:29:41 | 显示全部楼层
21cns*** 发表于 2024-12-3 17:28
请问SDCC\IAR生成的lib和keil生成的lib通用吗?

你赶紧试一下
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2940

积分

荣誉版主

无情的代码机器

积分
2940
发表于 2024-12-3 19:36:19 | 显示全部楼层
21cns*** 发表于 2024-12-3 17:28
请问SDCC\IAR生成的lib和keil生成的lib通用吗?

试了没,不支持吧
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2940

积分

荣誉版主

无情的代码机器

积分
2940
发表于 2024-12-3 19:37:50 | 显示全部楼层
gpt的解释:
截图202412031937187189.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2025-05-02 08:15:40
已绑定手机

13

主题

1257

回帖

2975

积分

金牌会员

积分
2975
发表于 2024-12-3 21:15:27 | 显示全部楼层

截图这样讲,我倒是有个疑问:STC发布的lib库文件应该是没有区分keil/SDCC/IAR的(下载的lib文件只有一种),不知道用什么编译器生成的?

点评

只能keil下用吧 [attachimg]68147[/attachimg]  详情 回复 发表于 2024-12-3 21:50
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2940

积分

荣誉版主

无情的代码机器

积分
2940
发表于 2024-12-3 21:50:25 | 显示全部楼层
21cns*** 发表于 2024-12-3 21:15
截图这样讲,我倒是有个疑问:STC发布的lib库文件应该是没有区分keil/SDCC/IAR的(下载的lib文件只有一种 ...

只能keil下用吧
截图202412032150205760.jpg

点评

因为我只用keil,之前有疑问还以为都兼容呢。这下知道了,多谢  发表于 2024-12-3 23:00
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:123
  • 最近打卡:2025-04-19 16:12:35
已绑定手机

60

主题

777

回帖

4001

积分

论坛元老

自定义头衔

积分
4001
发表于 2024-12-3 22:12:57 | 显示全部楼层
本帖最后由 VCC 于 2024-12-3 23:02 编辑
21cns*** 发表于 2024-12-3 21:15
截图这样讲,我倒是有个疑问:STC发布的lib库文件应该是没有区分keil/SDCC/IAR的(下载的lib文件只有一种 ...

这个我之前有个帖子探究过

刚刚我调用最新的lib库,搞错一个东西.和大家分享一下我的错误 - 第2页 - C语言,汇编语言,Proteus MCU软件仿真 国芯技术交流网站 - AI32位8051交流社区

结论:STC发布的lib文件是 OMF51 格式的,只能被BL51和LX51这两款Keil PK51工具链里的链接器识别

至于Windows系统里的静态链接库,虽然也是.lib后缀,但那是完全不同的文件格式了


点评

明白了,原来stc发布的lib只能用于keil。多谢  发表于 2024-12-3 22:59
联系我请点击左下角的【回复】按钮,否则我收不到消息提
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 11:17 , Processed in 0.140844 second(s), 112 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表