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

Visual Studio中自定义DLL无法被其他项目调用的问题求助

解决DLL调用时“标识符未定义”的问题

你遇到的核心问题是客户端代码没有声明要调用的DLL函数,编译器根本不知道nhan_2是什么函数,自然会报“标识符未定义”。按以下步骤修复:

第一步:给DLL项目补个导出头文件

在你的DLL项目里新建一个头文件(比如命名为DllExport.h),把要导出的函数声明放在这里,用条件编译区分导出/导入状态:

#pragma once
// 预定义宏,编译DLL时触发导出,编译客户端时触发导入
#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif

// 声明要导出的两个函数,extern "C"避免C++名称修饰
extern "C" DLL_API int nhan_2(int a);
extern "C" DLL_API int nhan_4(int a);

然后修改DLL的源文件,替换原来的导出代码,改成包含这个头文件:

#include "pch.h"
#include "DllExport.h"  // 新增:包含刚才的导出头文件
#include <windows.h>
#include <iostream>

// 这里不用再写__declspec(dllexport),头文件里已经处理了
int nhan_2(int a) {
    return a * 2;
}

int nhan_4(int a) {
    return a * 4;
}

还要给DLL项目加个预定义宏:打开DLL项目属性,找到C/C++ -> 预处理器 -> 预处理器定义,添加DLL_EXPORTS,这样编译DLL时就会自动把函数标记为导出。

第二步:在客户端项目里用这个头文件

把DLL项目里的DllExport.h复制到客户端项目的源码目录,或者在客户端项目的C/C++->常规->附加包含目录里添加DLL项目的源码路径(注意不是Debug输出目录,是D:\OLD C DRIVE\source\repos\Dll)。

然后修改客户端代码,加上头文件包含:

#include<iostream>
#include "DllExport.h"  // 新增:导入DLL的函数声明
using namespace std;
#pragma comment (lib, "Dll.lib")

int main() {
    int b = nhan_2(3);
    cout << "b equal: " << b << endl;
}

第三步:清理冗余配置

你之前的配置里有重复项,可以简化:

  • 删掉VC++目录->外部包含目录的配置,只用C/C++->常规->附加包含目录就行
  • 确认客户端项目的平台是x86、模式是Debug,和DLL的编译配置完全一致
  • 后期生成事件的xcopy命令保留,确保运行时能找到DLL文件

为什么之前会报错?

C++编译器在编译客户端代码时,必须知道函数的返回值类型、参数列表这些信息(也就是函数声明),才能正确生成调用指令。之前你直接调用nhan_2,编译器根本识别不了这个函数,自然报“标识符未定义”。加上头文件声明后,编译器能识别函数签名,链接阶段再通过Dll.lib找到DLL里的函数实现,问题就解决了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:22:50