VS2022,lib调用dll工程的一个函数

lib工程本身是一个静态库工程,没有链接器设置。然而,我们依然可以在lib工程中调用DLL工程中的函数,只需要确保头文件正确导入,并在最终使用lib的可执行文件项目中正确链接DLL的.lib文件。下面是一个详细的步骤说明:

假设的工程结构

假设有以下项目:

  1. DLL工程 (DLLProject)
  2. 静态库工程 (LibProject)
  3. 可执行文件工程 (ExeProject)

步骤

1. 在DLL工程中定义和导出函数

DLLProject.h

cpp 复制代码
#pragma once
#ifdef BUILDING_DLL
#define DLL_PUBLIC __declspec(dllexport)
#else
#define DLL_PUBLIC __declspec(dllimport)
#endif

extern "C" DLL_PUBLIC int func1();

DLLProject.cpp

cpp 复制代码
#include "DLLProject.h"

int func1() {
    return 42;
}

在这个DLL工程中添加预处理器:右键工程,点击属性


写完之后,#define DLL_PUBLIC __declspec(dllexport)就会生效。
Lib工程不需要这样做,所以,Lib工程的#define DLL_PUBLIC __declspec(dllimport)这个会生效

2. 在静态库工程中包含DLL工程的头文件并使用函数

LibProject.cpp

cpp 复制代码
#include "DLLProject.h"

void useFunc() {
    int result = func1();
    // 使用 result 进行进一步处理
}
3. 在可执行文件工程中配置链接和调用

在可执行文件工程中,需要链接DLL的.lib文件以及静态库的.lib文件。

main.cpp

cpp 复制代码
#include <iostream>
#include "DLLProject.h"
#include "LibProject.h" // 包含静态库工程的头文件

int main() {
    useFunc(); // 调用静态库中的函数,它内部调用了DLL中的函数
    int result = func1(); // 直接调用DLL中的函数
    std::cout << "Result from func1: " << result << std::endl;
    return 0;
}

可执行文件工程设置

  1. 包含路径

    • 在项目属性 -> VC++目录 -> 包含目录中,添加DLL工程和静态库工程的头文件路径。
  2. 库目录

    • 在项目属性 -> VC++目录 -> 库目录中,添加DLL工程和静态库工程生成的lib文件路径。
  3. 附加依赖项

    • 在项目属性 -> 链接器 -> 输入 -> 附加依赖项中,添加DLL生成的lib文件(例如DLLProject.lib)和静态库生成的lib文件(例如LibProject.lib)。

配置示例

假设目录结构如下:

复制代码
/path/to/your/projects/
│
├── DLLProject/
│   ├── include/
│   │   └── DLLProject.h
│   ├── src/
│   │   └── DLLProject.cpp
│   ├── build/
│   │   ├── Debug/
│   │   │   ├── DLLProject.dll
│   │   │   └── DLLProject.lib
│   │   └── Release/
│   │       ├── DLLProject.dll
│   │       └── DLLProject.lib
│
├── LibProject/
│   ├── include/
│   │   └── LibProject.h
│   ├── src/
│   │   └── LibProject.cpp
│   ├── build/
│   │   ├── Debug/
│   │   │   └── LibProject.lib
│   │   └── Release/
│   │       └── LibProject.lib
│
└── ExeProject/
    ├── include/
    │   └── LibProject.h
    ├── src/
    │   └── main.cpp
    ├── build/
    │   ├── Debug/
    │   └── Release/

ExeProject的项目设置

  1. 包含路径

    • 在项目属性 -> VC++目录 -> 包含目录中,添加/path/to/your/projects/DLLProject/include/path/to/your/projects/LibProject/include
  2. 库目录

    • 在项目属性 -> VC++目录 -> 库目录中,添加/path/to/your/projects/DLLProject/build/Debug/path/to/your/projects/LibProject/build/Debug
  3. 附加依赖项

    • 在项目属性 -> 链接器 -> 输入 -> 附加依赖项中,添加DLLProject.libLibProject.lib

通过这些步骤,你应该能够在静态库工程中使用从DLL导入的函数,并在可执行文件工程中正确链接和调用这些函数。

相关推荐
cookies_s_s1 小时前
C++ 字符串动态创建对象 -- 工厂模式、自动注册、模板递归动态调用
服务器·开发语言·c++
王老师青少年编程1 小时前
2026年6月GESP真题及题解(C++七级):消消乐
数据结构·c++·算法·真题·gesp·2026年6月
海清河晏1111 小时前
数据结构 | 二叉搜索树
数据结构·c++·visual studio
盐焗鹌鹑蛋2 小时前
【C++】继承
开发语言·c++
栈溢出了2 小时前
Java Lambda 表达式笔记
java·开发语言·intellij-idea
会周易的程序员3 小时前
使用 pybind11 封装 C++ 日志库 microLog 为 Python 模块
java·c++·python·物联网·架构·日志·aiot
WZF-Sang3 小时前
网络基础——2
服务器·网络·c++·学习·网络编程·php
zhixingheyi_tian3 小时前
一份GC日志的解读
java·开发语言
czhaii3 小时前
串口1中断收发-C语言-MODBUS协议
c语言·开发语言
apihz3 小时前
随机驾考题目(C 照科一 / 科四 2000+ 题)免费API调用教程
android·java·c语言·开发语言·网络协议·tcp/ip