无法导出DLL中的函数

时间:2014-04-03 12:59:14

标签: c++ dll visual-studio-2005

我有一个.lib,它有一个我想要制作成DLL的函数。

在项目属性中,我做了两件事, 1.在C / C ++中 - >一般 - >其他目录:添加了.h文件的路径。 2.在链接器中 - >一般 - >附加Dependies:添加了.lib文件的路径

然后我制作了一个.h文件

#ifndef _DFUWRAPPER_H_
#define _DFUWRAPPER_H_

#include <windows.h>
#include "DFUEngine.h"

#ifdef __cplusplus
extern "C" {
#endif

__declspec(dllexport) void helloworld(void);
__declspec(dllexport) void  InitDLL();

#ifdef __cplusplus
}
#endif 

#endif 

并制作.cpp文件

#include "stdafx.h"
#include "stdio.h"
#include "DFUWrapper.h"

#ifdef _MANAGED
#pragma managed(push, off)
#endif

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif

void helloworld(void)
{
    printf("hello world DFU");
}

DFUEngine* PyDFUEngine()
{
    return new DFUEngine();
}

void delDFUEngine(DFUEngine *DFUe)
{
    DFUe->~DFUEngine();
}

void  PyInitDLL(DFUEngine *DFUe)
{
    return DFUe->InitDLL();
}

我使用函数helloword进行了测试。我可以在DLL中看到此函数,但不能看到InitDLL函数。 我怎么能绕过这个?请帮忙

2 个答案:

答案 0 :(得分:0)

在DLL头文件中定义以下内容

#if defined (_MSC_VER)
#if defined (MY_DLL_EXPORTS)
#define MY_EXPORT __declspec(dllexport)
#else
#define MY_EXPORT __declspec(dllimport)
#endif
#else
#define MY_EXPORT
#endif

使用该宏声明您的函数

#ifdef __cplusplus
extern "C" {
#endif

MY_EXPORT void helloworld(void);
MY_EXPORT void InitDLL();

#ifdef __cplusplus
}
#endif 

在你的.cpp

MY_EXPORT void helloworld(void)
{
    printf("hello world DFU");
}

MY_EXPORT void InitDLL()
{
    /// blahblah 
}

使用MY_DLL_EXPORT定义编译您的DLL .... 但是要确保它在你想要IMPORT ....时没有定义。

答案 1 :(得分:0)

我喜欢从DLL using .DEF files导出函数。

这有一个额外的好处,即避免名称修改:不仅是C ++复杂的修改,还有__stdcallextern "C"函数(例如_myfunc@12)。

您可能只想为DLL添加DEF文件,例如:

LIBRARY   MYDLL
EXPORTS
   InitDLL     @1
   helloworld  @2
   ... other functions ...