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

无法调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:37:42