如何在Visual Studio 2019中将含.c/.h文件的SOEM项目转换为.dll动态链接库并解决头文件识别问题
我之前折腾过把SOEM打包成VS的DLL,对你遇到的问题太熟悉了!你碰到的头文件识别问题不是通用的头文件引用bug,而是SOEM本身的平台抽象结构导致的。下面我分两部分给你拆解解决方案:
一、解决SOEM的头文件识别与DLL打包问题
SOEM的OSAL(操作系统抽象层)和OSHW(硬件抽象层)是分平台实现的,直接把所有文件丢进项目会导致VS不知道该用哪部分代码,进而出现头文件找不到的问题。按以下步骤来:
- 筛选平台相关文件:Windows平台下,只需要保留
osal/win32和oshw/win32目录下的文件,把其他平台(比如linux、rtos)的OSAL/OSHW文件从项目里移除,避免编译冲突。 - 配置包含目录:右键项目→属性→C/C++→常规→附加包含目录,添加以下路径(假设你把SOEM源码放在项目根目录的
soem文件夹下):$(SolutionDir)soem$(SolutionDir)soem/osal/win32$(SolutionDir)soem/oshw/win32
这样VS就能正确找到所有SOEM的头文件了。
- 设置预编译宏:在项目属性→C/C++→预处理器→预处理器定义里添加:
WIN32;_WINDOWS;SOEM;_WIN64(如果是32位项目就去掉_WIN64)
这些宏会告诉SOEM编译Windows平台的代码分支。 - 链接系统依赖库:SOEM在Windows下需要依赖系统网络库,在项目属性→链接器→输入→附加依赖项里添加:
ws2_32.lib;iphlpapi.lib
二、VS2019将现有项目转成DLL的通用方法
不管是SOEM还是其他C/C++项目,转成DLL都可以用以下两种方法:
方法1:直接修改现有项目属性
- 右键目标项目→属性→配置属性→常规→项目默认值→配置类型,选择
动态库(.dll)。 - 配置导出符号:要让其他项目能调用DLL里的函数,需要标记导出符号。推荐用宏的方式统一管理:
在公共头文件里添加:
然后把需要导出的函数声明改成#ifdef PROJECT_EXPORTS #define PROJECT_API __declspec(dllexport) #else #define PROJECT_API __declspec(dllimport) #endifPROJECT_API 返回类型 函数名(参数),比如:
最后在项目预处理器定义里添加PROJECT_API int ec_init(const char *ifname);PROJECT_EXPORTS(替换成你自己的项目名,比如SOEM就用SOEM_EXPORTS),这样编译DLL时会自动导出这些函数。 - 清理冗余文件:移除项目里不需要编译的文件(比如其他平台的实现、测试代码等),避免编译错误。
方法2:新建DLL项目导入现有文件
- 打开VS2019,新建“动态链接库(DLL)”项目。
- 把现有项目的
.c/.h文件复制到新项目目录,右键新项目→添加→现有项,选中这些文件。 - 按方法1里的步骤配置包含目录、预编译宏、导出符号和依赖库即可。
通用注意事项
- 保持平台一致性:编译DLL的平台(x86/x64)要和调用它的项目一致,否则会出现兼容性问题。
- 处理依赖关系:如果项目依赖其他第三方库,要确保这些库的链接路径和包含目录都正确配置。
内容的提问来源于stack exchange,提问作者John




