在开始本篇的阅读前,您可能需要阅读以下博文,若您具备相关基础知识则可直接查看正文。
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目录下
#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
#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库(动态库已链接)。