在c ++

时间:2017-06-06 13:54:07

标签: c++ dll shared-libraries static-libraries lib

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

为此,我创建了一个带有c ++文件的visual studio c ++ DLL项目,该文件从库中调用所需的函数。 .lib在链接器/输入/附加依赖中链接到visual studio。

为了简单起见,我试图从普通的c ++文件中调用我的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函数,它会崩溃(没有错误消息)。

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

我不明白我做错了什么?

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

1 个答案:

答案 0 :(得分:0)

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

另一方面,.lib文件可能包含允许链接器链接到.dll的符号,但正如我上面提到的,您需要.dll - 然后.lib文件是无用的。由于你无法在没有库的原始源代码的情况下构建.dll,你可以编写自己的库(使用给定的头文件)并将其构建为.dll。

有关您可以在What's the differences between .dll , .lib, .h files?

下找到的图书馆的更多信息

微软也有一些演练指南:
Walkthrough: Creating and Using a Static Library (C++)
Walkthrough: Creating and Using a Dynamic Link Library (C++)