无法调用DLL函数:构建共享库时遇LNK2019链接错误求助
问题分析与解决方法
错误原因
你遇到的LNK2019和LNK1120链接错误,核心问题是:
- CMake仅单独构建了可执行文件
MN和共享库MnShared,但未建立两者的链接关系,导致链接器无法找到foo函数的实现符号; - 手动拆分
__declspec(dllexport)和__declspec(dllimport)的写法不规范,容易出现编译/链接不一致问题。
解决步骤
1. 修正CMakeLists.txt,添加链接依赖
修改原CMake配置,让可执行文件MN明确链接到MnShared库:
cmake_minimum_required(VERSION 3.8) project(MN CXX) # 先构建共享库 add_library(MnShared SHARED shared.cpp) # 构建可执行文件,并链接到共享库 add_executable(MN main.cpp) target_link_libraries(MN PRIVATE MnShared)
2. 用宏统一管理DLL导入导出(推荐)
手动写__declspec(dllexport)/__declspec(dllimport)容易出错,建议通过头文件宏统一控制:
创建shared.h头文件:
#ifndef SHARED_H #define SHARED_H // 编译库时导出符号,使用库时导入符号 #ifdef MNSHARED_EXPORTS #define MNSHARED_API __declspec(dllexport) #else #define MNSHARED_API __declspec(dllimport) #endif // 声明foo函数 MNSHARED_API int foo(int); #endif // SHARED_H
修改shared.cpp:
#define MNSHARED_EXPORTS // 编译库时定义此宏,触发dllexport #include "shared.h" int foo(int k) { return k; }
修改main.cpp:
#include <iostream> #include "shared.h" // 自动使用dllimport声明foo int main() { std::cout << foo(5) << std::endl; }
验证
重新生成CMake缓存并构建项目,链接错误会消失,可执行文件将正常调用共享库中的foo函数。
内容的提问来源于stack exchange,提问作者Allay466
相关产品推荐
相关产品推荐

