在c++中从.DLL调用.lib

问题描述 投票:0回答:1

我想使用公司提供的c++库。我只有 .lib 和 .h 文件。我想统一使用它。所以我需要一个DLL。所以我想创建一个 DLL,允许我访问 .lib 中所需的函数。

为此,我创建了一个 Visual Studio C++ DLL 项目,其中包含一个从库中调用所需函数的 C++ 文件。 .lib 在链接器/输入/附加依赖项中链接到 Visual Studio。

为了简单起见,我尝试从普通的 C++ 文件而不是 unity 中调用 DLL 的函数。

我的测试文件如下所示:

#include <windows.h>
#include <iostream>

void CallMyDLL(void)
{
 HINSTANCE hGetProcIDDLL = LoadLibrary("C:\\path\\museDLL.dll");
 FARPROC lpfnGetProcessID = GetProcAddress(HMODULE (hGetProcIDDLL),"startConnection");
   typedef void (__stdcall * pICFUNC)();
   pICFUNC startConnection;
   startConnection = pICFUNC(lpfnGetProcessID);

  //std::cout << test<< std::endl;

  startConnection(); 

  FreeLibrary(hGetProcIDDLL);

}
int main () {
CallMyDLL();
}

我的主 DLL 文件如下所示:

#include "dllmain.h"  
#include <iostream>
#include <fstream>
#include "main_muse.h"
namespace museDLL
{
    MainPage* mp;
      void startConnection()
    {
           mp = new  MainPage();
    }

    double getValue()
    {   
        return mp->getValueEEG();
    }

    double test()
    {
        return 1.2f;
    } 

}

dllmain.h

#pragma once  

#ifdef DLL_EXPORTS  
#define DLL_API __declspec(dllexport)   
#else  
#define DLL_API __declspec(dllimport)   
#endif  

namespace museDLL
{
    extern "C" {
        DLL_API void __cdecl startConnection();
        DLL_API double __cdecl getValue();
        DLL_API double __cdecl test();

    }
}

如果我在 DLL 中调用测试函数,它就会起作用。但是,如果我调用使用原始 .lib 中的函数的 startConnection 函数,它会崩溃(没有错误消息)。

所以为了说清楚,我想要测试文件->调用我的自定义DLL->调用下载的.lib。

我不明白我做错了什么?

我想知道初始的 .lib 是否包含在 .DLL 中,或者我是否需要以某种方式链接它?

c++ dll shared-libraries static-libraries
1个回答
0
投票

您只有 .lib 文件和头文件。 看起来,你有一个静态库。因此,您可以构建应用程序并将库链接为静态库。 换句话说,除非您无法访问该库的源代码,否则您无法以某种方式从给定的 .lib 创建 .dll 库。 只需包含头文件、设置链接器选项并调用应用程序中的函数即可。

另一方面,.lib 文件可以包含允许链接器链接到 .dll 的符号,但正如我上面提到的,您需要 .dll - 那么 .lib 文件就没用了。由于没有库的原始源代码就无法构建 .dll,因此您可以编写自己的库(使用给定的标头)并将其构建为 .dll。

有关库的更多信息,您可以在.dll、.lib、.h 文件之间有什么区别?

微软也有一些演练指南:
演练:创建和使用静态库 (C++):
演练:创建和使用动态链接库 (C++)

© www.soinside.com 2019 - 2024. All rights reserved.