错误C2491:不允许定义dllimport函数

时间:2016-06-07 07:46:33

标签: c++ dllimport dllexport msvc12

我在Visual Studio 2013上创建一个dll有问题。此代码适用于Code :: Blocks。错误是definition of dllimport function not allowed" on line void DLL_EXPORT prim(map<string, vector<int>> nodes, map<pair<string, string>, pair<int, string>> edges)。如何解决?

main.h:
#ifndef __MAIN_H__
#define __MAIN_H__

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

using namespace std;

#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif


#ifdef __cplusplus
extern "C"
{
#endif

void DLL_EXPORT prim( map<string,vector<int>> nodes, map<pair<string,string>,pair<int,string>> edges);

#ifdef __cplusplus
}
#endif

#endif // __MAIN_H__

第二个文件:

main.cpp:
#include "main.h"
//some other includes

// a sample exported function

extern "C"
{
    void DLL_EXPORT prim(map<string, vector<int>> nodes, map<pair<string, string>, pair<int, string>> edges)
    {
        //some code
    }
}

我试图解决它,但我没有更多的想法。当我将第二个文件中的prim函数从定义更改为声明时,dll编译时没有错误,但没有代码负责算法的实现。

感谢所有回复。

编辑:

我将临时的#define BUILD_DLL添加到main.h中,然后在Cmake中添加,我工作。谢谢你的回复。

3 个答案:

答案 0 :(得分:4)

main.hmain.cpp将在您正在创建的DLL项目中使用。

只有main.h将在访问您创建的DLL的客户端可执行文件/ DLL中使用。

因此,DLL项目的main.h需要__declspec(dllexport)。这样就可以从DLL导出函数了。因此,在DLL Project's Properties -> C/C++ -> 'Preprocessor definitions'

中定义 BUILD_DLL 客户端可执行文件的

main.h需要__declspec(dllimport)。这样就可以从DLL导入函数了。所以无需Executable Project's Properties -> C/C++ -> 'Preprocessor definitions'

中定义 BUILD_DLL

答案 1 :(得分:0)

您应该只定义BUILD_DLL是您的某些标题或项目属性 - &gt; C / C ++ - &gt; &#39;预处理器定义&#39;。 所以DLL_EXPORT将是__declspec(dllexport),这就是你构建你的dll时所需要的。如果要从其他dll导入函数,则需要__declspec(dllimport)。此错误意味着您无法重新定义导入的函数,因为它在您导入它的dll中定义。

答案 2 :(得分:-1)

我认为你只需要删除main.cpp中的DLL_EXPORT。该错误表示定义中不允许这样做。由于它有一个{...}的主体,因此它是一个定义。