如何让项目同时编译生成DLL与LIB以支持单元测试依赖?
当然可行!而且完全不用复制项目这么麻烦——不管是CMake还是Visual Studio原生的MSBuild构建系统,都能轻松实现让你的DLL项目同时输出动态链接库(DLL)和对应的导入LIB文件,甚至还能按需生成静态LIB版本,完美适配你的单元测试需求。
方案1:用CMake实现(推荐跨平台场景)
在CMake中,DLL项目默认就会生成用于链接的导入LIB文件,只要你正确配置符号导出,就能直接给测试项目用。如果还需要同时生成静态LIB版本,也能一键搞定:
步骤1:配置原DLL项目的CMakeLists.txt
# 创建DLL目标 add_library(MyCoreProject SHARED src/core_module.cpp src/utils.cpp include/my_core/core_module.h include/my_core/utils.h ) # 配置符号导出:仅在DLL项目中定义导出宏 target_compile_definitions(MyCoreProject PRIVATE MY_CORE_EXPORTS) # 公开头文件目录,方便测试项目引用 target_include_directories(MyCoreProject PUBLIC include) # (可选)如果需要同时生成静态LIB版本,复用源文件创建静态目标 add_library(MyCoreProjectStatic STATIC src/core_module.cpp src/utils.cpp include/my_core/core_module.h include/my_core/utils.h ) target_include_directories(MyCoreProjectStatic PUBLIC include)
步骤2:配置测试项目链接LIB
测试项目只需要链接生成的LIB文件,不需要重复添加源文件:
add_executable(MyCoreTests tests/test_core_module.cpp tests/test_utils.cpp ) # 链接DLL的导入LIB,或者静态LIB二选一 target_link_libraries(MyCoreTests PRIVATE MyCoreProject) # 或者用静态LIB:target_link_libraries(MyCoreTests PRIVATE MyCoreProjectStatic)
构建后,你会在输出目录得到MyCoreProject.dll、MyCoreProject.lib(导入库)和MyCoreProjectStatic.lib(静态库),测试项目直接用就行。
方案2:Visual Studio原生项目(MSBuild)实现
如果你用的是VS自带的DLL项目模板,其实默认就会生成导入LIB文件,关键是要正确设置符号导出:
步骤1:在头文件中定义导出宏
// my_core_export.h #ifdef MY_CORE_EXPORTS #define MY_CORE_API __declspec(dllexport) #else #define MY_CORE_API __declspec(dllimport) #endif // 在需要导出的类/函数前加宏 #include "my_core_export.h" class MY_CORE_API CoreModule { ... }; MY_CORE_API int calculate(int a, int b);
步骤2:配置DLL项目属性
打开DLL项目的属性页:
- 进入
C/C++ -> 预处理器 -> 预处理器定义,添加MY_CORE_EXPORTS(只有DLL项目需要加,测试项目不要加) - 确保
链接器 -> 高级 -> 导入库选项是默认值(会自动生成和DLL同名的LIB文件)
步骤3:配置测试项目引用LIB
测试项目不需要添加任何原项目的CPP文件,只需要:
- 进入
C/C++ -> 常规 -> 附加包含目录,添加原项目的头文件目录 - 进入
链接器 -> 输入 -> 附加依赖项,添加生成的MyCoreProject.lib路径 - 确保测试运行时能找到DLL文件(可以把DLL复制到测试项目的输出目录,或者设置系统环境变量)
这样设置后,测试项目就能正常编译运行,完全不用复制原项目的源文件,既优雅又能保证依赖的一致性。
内容的提问来源于stack exchange,提问作者Shrouded




