错误 C2491:不允许定义 dllimport 函数
Error C2491: definition of dllimport function not allowed
我在 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 中我开始工作。感谢回复。
您应该只定义 BUILD_DLL
是您的一些 headers 或在项目属性 -> C/C++ -> 'Preprocessor definitions' 中。
所以 DLL_EXPORT
将是 __declspec(dllexport)
,这就是你在构建 dll 时想要的。 __declspec(dllimport)
如果您想从其他 dll 导入函数,则需要。这个错误意味着你不能重新定义导入的函数,因为它在你导入它的 dll 中定义。
main.h
和 main.cpp
将用于您正在创建的 DLL 项目。
只有 main.h
会在访问您创建的 DLL 的客户端 Executable/DLL 中使用。
因此,main.h
的 DLL 项目需要 __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
我认为您只需删除 main.cpp 中的 DLL_EXPORT
。错误说它在定义中是不允许的。因为它在那里有一个主体{...}
,所以它是一个定义。
我在 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 中我开始工作。感谢回复。
您应该只定义 BUILD_DLL
是您的一些 headers 或在项目属性 -> C/C++ -> 'Preprocessor definitions' 中。
所以 DLL_EXPORT
将是 __declspec(dllexport)
,这就是你在构建 dll 时想要的。 __declspec(dllimport)
如果您想从其他 dll 导入函数,则需要。这个错误意味着你不能重新定义导入的函数,因为它在你导入它的 dll 中定义。
main.h
和 main.cpp
将用于您正在创建的 DLL 项目。
只有 main.h
会在访问您创建的 DLL 的客户端 Executable/DLL 中使用。
因此,main.h
的 DLL 项目需要 __declspec(dllexport)
。这样就可以从 DLL 中导出函数。因此,在 DLL Project's Properties -> C/C++ -> 'Preprocessor definitions'
main.h
需要 __declspec(dllimport)
。这样就可以从 DLL 中导入函数。所以不需要在Executable Project's Properties -> C/C++ -> 'Preprocessor definitions'
我认为您只需删除 main.cpp 中的 DLL_EXPORT
。错误说它在定义中是不允许的。因为它在那里有一个主体{...}
,所以它是一个定义。