You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake生成项目未生成导入库,如何构建DLL并关联项目?

解决CMake创建DLL并链接时LNK1104找不到.lib文件的问题

问题原因

在MSVC环境下,编译SHARED类型的DLL库时,只有当代码中存在导出的函数、类或变量时,编译器才会生成对应的导入库(.lib文件)。你的代码中没有任何导出符号,因此不会生成mydll.lib,导致链接test_dll时报错。

解决方案

1. 在DLL代码中添加导出符号

修改dllmain.cpp,定义导出宏并导出需要对外暴露的符号:

#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif

// 导出一个示例函数(根据实际需求替换)
MYDLL_API void MyDllFunction();

void MyDllFunction() {
    // 函数具体实现
}

2. 修改CMake配置,自动定义导出宏

更新CMakeLists.txt,给mydll目标添加编译定义,确保编译DLL时自动开启导出逻辑:

cmake_minimum_required (VERSION 3.20)
project (DllTest)
if (MSVC)
    add_compile_definitions(UNICODE _UNICODE)
endif()

add_library(mydll SHARED dllmain.cpp)
# 仅在编译mydll时定义MYDLL_EXPORTS,触发符号导出
target_compile_definitions(mydll PRIVATE MYDLL_EXPORTS)

add_executable(test_dll testmain.cpp)
target_link_libraries(test_dll PUBLIC mydll)

3. 编译验证

重新生成项目并编译,此时MSVC会生成mydll.lib导入库和mydll.dll文件,test_dll可以正常链接到mydll。

特殊情况处理

如果你的DLL确实不需要导出任何符号(极少场景),但仍需生成.lib文件,可以通过指定.def文件强制生成:

  1. 创建mydll.def文件,内容如下:
    LIBRARY "mydll"
    EXPORTS
    ; 可留空,或添加需要导出的符号
    
  2. 在CMake中添加配置:
    set_target_properties(mydll PROPERTIES LINK_FLAGS "/DEF:${CMAKE_CURRENT_SOURCE_DIR}/mydll.def")
    

内容的提问来源于stack exchange,提问作者mans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:31:06