具体过程
原来的build.bat编译脚本生成.dll文件是这样写的
g++和gcc即所所配制的MinGW工具链\bin路径下的g++.exe和gcc.exe,首先这里是只生成了.dll文件,但是找资料或问AI说CMake链接.dll库同时要静态链接库(如.lib)和动态链接库(如.dll);且该项目uart_win32.c中大量用了bool类型C/C++的语法(但大部分还是很纯正的C语言语法,甚至还有goto),注意到上面1条命令第一条编译生成.o文件用的是g++,第2条打包为.dll库用的是gcc两者是分开的,我在试过直接都用g++打包.dll的时候会出现英文形如“不知道编译的是那种语言”报错,后来仔细看才发现这里的细节,将这两句脚本改为如下
回到“学习过程”看的教程,AI搜索.lib静态链接库的文件只适用于MSVC编译器,对于MinGW64(即使是在Windows环境开发)是不可行的,编译过程会报错提示“找不到库文件”(即使uart_win32.lib文件就在路径中),要用.a格式的静态链接库,正如它报错提示要的需要-luart_win32文件指的就是libuart_win32.a这个文件,如之前看有的MinGW工具链Make配置找链接库的时候写“uart_win32”通常指的是找这个“libxxx.a”格式文件即找路径中的libuart_win32.a
上面CMakelist.txt中配置target_link_libraries即“添加链接库”,里面要填进去的是静态链接库的路径,一般Visual Studio用MSVC开发的话就用.lib格式文件,MinWG开发的话就用“libxxx.a”格式文件(Windows操作系统也是如此),使用的时候要在.exe程序路径下放入对应的.dll动态链接库文件(除格式外和静态链接库文件同名)
实际用的时候我把它用在了C++工程,但是实际代码中引用这个主要由C语言打包成的.dll库的时候#include引用要这样写,不然g++编译的时候还是会显示形如“函数在.h声明但是未找到定义”的报错,当然调用一个.dll动态链接库过程.h文件也是不可少的要放在路径中被用到的.cpp索引到,总结一个C/C++工程调用一个.dll动态链接库必要的3种格式文件是.h文件(用于编程#include索引)、.dll文件(相当于该库源代码本身)、.lib\libxxx.a静态链接库文件(用于配置工程链接到.dll)
在新C++工程build.bat脚本的构建CMake和调用MinGW编译部分命令
最终编译成功,程序功能也正常。