You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何让项目同时编译生成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.dllMyCoreProject.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

火山引擎 最新活动