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.lib和LibProject.lib。

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

相关推荐
Sapphire~9 分钟前
odoo-095 视图的重写规则(全部重写还是部分改写)
开发语言·javascript·ecmascript
利威尔xu10 分钟前
Go GMP 调度器 10 个高频追问:3 个线上故障让 P99 从 80ms 飙到 2s、10 万 goroutine 泄漏
开发语言·后端·面试·性能优化·golang
中电金信16 分钟前
从业务调优到分层缓存:DeepSeek V4 Flash的PPU实践
java·开发语言
梦影_19 分钟前
MySQL进阶教程(二)—— 储存过程与触发器(下)
开发语言·数据库·后端·sql·mysql·oracle·数据库开发
lg_cool_25 分钟前
Python 代码打包
开发语言·python
木雷坞28 分钟前
PHP两项9.2分漏洞:Docker容器更新与版本核验教程
开发语言·docker·php
2601_9628857236 分钟前
如何用 Python 做 MACD 金叉全市场选股?
开发语言·python
FfHUCisI38 分钟前
无锁 Reactor 网络模型与 gnet / evio 架构拆解
服务器·开发语言·后端·golang
笨笨饿39 分钟前
#145 _Codex 三层故障详细排查与修复步骤
开发语言·人工智能·stm32·单片机·嵌入式硬件
心中有你02141 小时前
C 语言文件操作详解:从写入、追加到读取与定位的完整 实战
c语言·开发语言