2016-06-07 38 views
0

У меня возникла проблема с созданием dll на Visual Studio 2013. Этот код работает на 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). Как это исправить?Ошибка C2491: определение функции dllimport не разрешено

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 компилировалась без ошибок, но без кода, ответственного за реализацию алгоритма.

Спасибо за все ответы.

Edit:

добавить временный #define BUILD_DLL к main.h, а затем в CMake и I работ. Спасибо за ответы.

ответ

2

main.h и main.cpp будут использованы в DLL Project, который вы создаете.

только main.h будет использоваться в качестве исполнителя/библиотеки DLL, к которому вы хотите подключиться к DLL, которую вы создали.

Для этого необходимо, чтобы main.h DLL Project нуждался в __declspec(dllexport). Чтобы функции могли быть экспортированы из DLL. Таким образом, определить BUILD_DLL в DLL Project's Properties -> C/C++ -> 'Preprocessor definitions'

main.h клиента Исполняемые требует __declspec(dllimport). Так что функции могут быть импортированы из DLL. Так нет необходимости определить BUILD_DLL в Executable Project's Properties -> C/C++ -> 'Preprocessor definitions'

0

Вы должны просто определить BUILD_DLL - это некоторые из ваших заголовков или в свойствах проекта -> C/C++ -> «Определения препроцессора». Таким образом, DLL_EXPORT будет __declspec(dllexport), и это то, что вы хотите, когда создаете свою dll. __declspec(dllimport) необходимо, если вы хотите импортировать функцию из другой dll. И эта ошибка означает, что вы не можете переопределить импортированную функцию, потому что она определена в dll, из которой вы ее импортируете.

0

Я думаю, вам просто нужно удалить DLL_EXPORT в main.cpp. Ошибка говорит, что в определении не допускается. Так как у него есть тело {...}, это определение.