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导入的函数,并在可执行文件工程中正确链接和调用这些函数。

相关推荐
Highcharts.js10 小时前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
头发还在的女程序员12 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
王维同学12 小时前
Winsock 协议与名称空间 Provider 目录
网络·c++·windows·安全
拳里剑气14 小时前
C++算法:BFS解决FloodFill算法
c++·算法·bfs·宽度优先
爱写代码的小朋友14 小时前
从零开始学 Win32 API:C++ 窗口编程实战(VS Code + MinGW-w64 命令行详解)
开发语言·c++
果汁华14 小时前
Function Calling 与 Python 实战完整指南
开发语言·网络·python
小小晓.14 小时前
C++:语句和作用域
开发语言·c++
fqbqrr14 小时前
2607C++,soui,xplayer视频播放器
c++·soui
wanderist.15 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法
zh路西法16 小时前
【10天速通ROS2-PX4无人机】(四) 关掉GPS和气压计,纯激光定位还能飞吗
c++·无人机·px4·ros2·卡尔曼滤波·fastlio2