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文件强制生成:
- 创建
mydll.def文件,内容如下:LIBRARY "mydll" EXPORTS ; 可留空,或添加需要导出的符号 - 在CMake中添加配置:
set_target_properties(mydll PROPERTIES LINK_FLAGS "/DEF:${CMAKE_CURRENT_SOURCE_DIR}/mydll.def")
内容的提问来源于stack exchange,提问作者mans
相关产品推荐
相关产品推荐

