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

相关推荐
dllmayday10 分钟前
Qt/QML + C++ 双向数据绑定(MVVM 模式的几种常用方法(ChatGPT)
开发语言·c++·qt
han_hanker19 分钟前
统一拦截异常 @RestControllerAdvice
java·开发语言·数据库
liu****21 分钟前
一.脚手架介绍以及部分工具使用
开发语言·数据结构·c++·手脚架开发
资深web全栈开发30 分钟前
深入理解 Google Wire:Go 语言的编译时依赖注入框架
开发语言·后端·golang
ohoy35 分钟前
EasyPoi 数据脱敏
开发语言·python·excel
fish_xk36 分钟前
c++类和对象(上)
c++
Hello World呀36 分钟前
Java实现手机号和身份证号脱敏工具类
java·开发语言
曹牧39 分钟前
Java:serialVersionUID
java·开发语言
ekprada1 小时前
DAY36 复习日
开发语言·python·机器学习
qq_256247051 小时前
Rust 模块化单体架构:告别全局 Migrations,实现真正的模块自治
开发语言·架构·rust