4

我在 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 中添加,我可以工作了。感谢您的回复。

4

3 回答 3

7

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

main.h用于访问您创建的 DLL 的客户端可执行文件/DLL。

因此,main.hDLL 项目需要__declspec(dllexport). 这样就可以从DLL中导出函数。所以,定义BUILD_DLLDLL Project's Properties -> C/C++ -> 'Preprocessor definitions'

main.h客户端可执行文件需要__declspec(dllimport). 这样就可以从DLL中导入函数。所以不需要在里面定义BUILD_DLLExecutable Project's Properties -> C/C++ -> 'Preprocessor definitions'

于 2016-06-07T08:52:44.140 回答
1

您应该只定义BUILD_DLL一些标题或在项目属性 - > C/C++ - > '预处理器定义'中。当你构建你的dllDLL_EXPORT__declspec(dllexport),这就是你想要的。__declspec(dllimport)如果要从其他 dll 导入函数,则需要。这个错误意味着你不能重新定义导入的函数,因为它是在你导入它的 dll 中定义的。

于 2016-06-07T07:52:09.773 回答
-1

我认为您只需要DLL_EXPORT在 main.cpp 中删除即可。该错误表明它在定义中是不允许的。既然它在那里有一个主体{...},它就是一个定义。

于 2017-06-30T23:36:12.353 回答