Windows平台使用Makefile编译libModbus库

本文详细介绍了如何使用Makefile在Windows平台上编译Modbus源代码,包括直接编译为可执行文件、编译为静态库与动态库,并强调了不同情况下ws2_32库的链接需求。
摘要由CSDN通过智能技术生成

在开始本篇的阅读前,您可能需要阅读以下博文,若您具备相关基础知识则可直接查看正文。
Makefile基础与入门1
Makefile基础与入门2
Modbus库的安装和简单读写测试

1. demo目录结构

PS E:\8.test_demo\0.Modbustest> tree
E:.
├─bin
├─doc
├─lib
├─obj
│  └─modbus
└─src	#Modbus主从机的main源文件在src目录下
    └─modbus_src	#libmodbus源文件在modbus_src目录下

控制台目录与Windows桌面文件夹的对应

#src目录
PS E:\8.test_demo\0.Modbustest\src> ls

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         2024/3/20      7:02                modbus_src
-a----          2024/4/7     20:16           1685 master_demo.cpp     
-a----          2024/4/8     20:16           2623 slave_demo.cpp 

控制台目录与Windows桌面文件夹的对应

#modbus_src目录
PS E:\8.test_demo\0.Modbustest\src\modbus_src> ls

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----          2024/4/4     20:30           6929 config.h
-a----          2019/8/1      5:38           5299 modbus-data.c        
-a----          2019/8/1      5:38           3430 modbus-private.h     
-a----          2019/8/1      5:38           1627 modbus-rtu-private.h 
-a----          2019/8/1      5:38          36772 modbus-rtu.c
-a----          2019/8/1      5:38           1199 modbus-rtu.h        
-a----          2019/8/1      5:38           1247 modbus-tcp-private.h 
-a----          2019/8/1      5:38          22620 modbus-tcp.c
-a----          2019/8/1      5:38           1373 modbus-tcp.h
-a----         2024/1/16     18:27           2124 modbus-version.h     
-a----          2019/8/1      5:38          58211 modbus.c
-a----          2019/8/1      5:38          11190 modbus.h

在这里插入图片描述

2. 直接将源文件编译成可执行文件的Makefile

main_src := $(wildcard src/*.cpp)
modbus_src := $(wildcard src/modbus_src/*.c)
main_objs := $(patsubst src/%.cpp,obj/%.o,$(main_src))
modbus_objs := $(patsubst src/modbus_src/%.c,obj/modbus/%.o,$(modbus_src))
execs := $(patsubst src/%.cpp,bin/%,$(main_src))

include_path := E:\8.test_demo\0.Modbustest\src\modbus_src
I_flags := $(include_path:%=-I%)
compile_opt := $(I_flags)

obj/modbus/%.o : src/modbus_src/%.c
	@gcc -c $^ -o $@ $(compile_opt)

obj/%.o : src/%.cpp
	@g++ -c $^ -o $@ $(compile_opt)

bin/% : obj/%.o $(modbus_objs)
	@g++ $^ -o $@ $(compile_opt) -lws2_32	#Windows平台libmodbus依赖于ws2_32库,编译成可执行文件时需要加上-lws2_32选项
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>伪目标>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
compile_o : $(modbus_objs) $(main_objs)

compile : $(execs)

debug : 
	@echo $(main_objs)
	@echo $(execs)

clean :
	@del /q obj obj\modbus bin

.PHONY : debug compile_o clean

3. 将libmodbus源文件编译成静态库并链接成可执行文件的Makefile

main_src := $(wildcard src/*.cpp)
modbus_src := $(wildcard src/modbus_src/*.c)
main_objs := $(patsubst src/%.cpp,obj/%.o,$(main_src))
modbus_objs := $(patsubst src/modbus_src/%.c,obj/modbus/%.o,$(modbus_src))

include_path := E:\8.test_demo\0.Modbustest\src\modbus_src
I_flags := $(include_path:%=-I%)
compile_opt := -g -O2 -w $(I_flags)
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>编译Modbus静态库>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
obj/modbus/%.o : src/modbus_src/%.c
	@gcc -c $^ -o $@ $(compile_opt)

lib/libmodbus.a : $(modbus_objs)
	@ar -r $@ $^

compile_lib : lib/libmodbus.a
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>链接库、编译可执行文件>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
execs := $(patsubst src/%.cpp,bin/%,$(main_src))
lib_path := E:\8.test_demo\0.Modbustest\lib
lingking_libs := $(patsubst lib/lib%.a,%,$(wildcard lib/*.a))
l_options := $(lingking_libs:%=-l%)
L_options := $(lib_path:%=-L%)
linking_flags := $(l_options) $(L_options)

obj/%.o : src/%.cpp
	@g++ -c $^ -o $@ $(compile_opt)

bin/% : obj/%.o
	@g++ $^ -o $@ $(linking_flags) -lws2_32

#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>伪目标>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
compile_lib : lib/libmodbus.a

compile : $(execs)

debug : 
	@echo $(linking_flags)
	@echo $(l_options)

clean :
	@del /q obj obj\modbus bin

.PHONY : debug compile_o clean compile_lib

4. 将libmodbus源文件编译成动态库并链接成可执行文件的Makefile

main_src := $(wildcard src/*.cpp)
modbus_src := $(wildcard src/modbus_src/*.c)
main_objs := $(patsubst src/%.cpp,obj/%.o,$(main_src))
modbus_objs := $(patsubst src/modbus_src/%.c,obj/modbus/%.o,$(modbus_src))

include_path := E:\8.test_demo\0.Modbustest\src\modbus_src
I_flags := $(include_path:%=-I%)
libCompile_opt := -g -O2 -w -fPIC $(I_flags)
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>编译Modbus动态库>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
obj/modbus/%.o : src/modbus_src/%.c
	@gcc -c $^ -o $@ $(libCompile_opt)

bin/libmodbus.dll : $(modbus_objs)	#与编译静态库相比编译动态库的指令后就需要加上-lws2_32选项
	@gcc -shared $^ -o $@ -lws2_32

compile_lib : bin/libmodbus.dll
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>链接库、编译可执行文件>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
execs := $(patsubst src/%.cpp,bin/%,$(main_src))
lib_path := E:\8.test_demo\0.Modbustest\bin
lingking_libs := $(patsubst bin/lib%.dll,%,$(wildcard bin/*.dll))
l_options := $(lingking_libs:%=-l%)
L_options := $(lib_path:%=-L%)
linking_flags := $(l_options) $(L_options)
compile_opt := -g -O2 -w $(I_flags)

obj/%.o : src/%.cpp
	@g++ -c $^ -o $@ $(compile_opt)

bin/% : obj/%.o	#动态库已经连接了-lws2_32库,编译可执行文件直接链接至动态库即可
	@g++ $^ -o $@ $(linking_flags)

#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>伪目标>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
compile_lib : bin/libmodbus.dll

compile : $(execs)

debug : 
	@echo $(linking_flags)
	@echo $(l_options)

clean :
	@del /q obj obj\modbus bin

.PHONY : debug compile clean compile_lib

5. 总结

windows平台,
Modbus源文件直接生成可执行文件需要连接-lws2_32;
Modbus源文件编译成静态库不需要依赖-lws2_32库,链接Modbus静态库生成可执行文件需要链接-lws2_32库;
Modbus源文件编译成动态库需要依赖-lws2_32库,链接Modbus动态库生成可执行文件不需要再链接-lws2_32库(动态库已链接)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZW_finder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值