我这边需要做成dll的算法代码比较多,而且分成很多个文件,我自己做了一个接口MakeCVNNAPI.cpp,在里面我声明了需要外部调用的函数MakeCVNN()以及算法计算后产生的传出结果vector<RLU> RL。然后在我win32的dll工程MakeCVNN中添加头文件MakeCVNN.h我另外做了CVNNDeclar.h文件,将接口函数MakeCVNN()以及传回的vector<RLU> RL进行了预声明:#pragma once
#include <vector>
using namespace std;typedef struct
{
double x;
double y;
}CVP;
typedef struct
{
CVP start;
CVP end;
}CVS;
typedef struct
{
CVP CVNN;
CVS segment;
}RLU;extern vector<RLU> RL;
void MakeCVNN(char * data, char * obstacle, char * qs);然后,我的MakeCVNN.h文件如下:#include "stdafx.h"
#include "CVNNDeclar.h"
#define DLLEXPORT __declspec(dllexport)
#define DLLIMPORT __declspec(dllimport)DLLIMPORT vector<RLU> RL;
extern "C" DLLEXPORT void MakeCVNN(char * data, char * obstacle, char * qs);问题:
编译错误:RL 重定义(就是我传回的结果,此结果在之前的MakeCVNNAPI.cpp中也被定义了一次vector<RLU> RL;)我这里就不太清楚是我哪次的声明或者定义产生了这个错误。
虽然MakeCVNNAPI.cpp文件中定义过一次vector<RLU> RL ,但是在CVNNDeclar.h进行的只是预声明extern,那么就是我在MakeCVNN.h中的DLLIMPORT vector<RLU> RL;出问题了。但是,不是必须将传回的结果RL以DLLIMPORT的方式声明在 MakeCVNN.h文件中吗?
#include <vector>
using namespace std;typedef struct
{
double x;
double y;
}CVP;
typedef struct
{
CVP start;
CVP end;
}CVS;
typedef struct
{
CVP CVNN;
CVS segment;
}RLU;extern vector<RLU> RL;
void MakeCVNN(char * data, char * obstacle, char * qs);然后,我的MakeCVNN.h文件如下:#include "stdafx.h"
#include "CVNNDeclar.h"
#define DLLEXPORT __declspec(dllexport)
#define DLLIMPORT __declspec(dllimport)DLLIMPORT vector<RLU> RL;
extern "C" DLLEXPORT void MakeCVNN(char * data, char * obstacle, char * qs);问题:
编译错误:RL 重定义(就是我传回的结果,此结果在之前的MakeCVNNAPI.cpp中也被定义了一次vector<RLU> RL;)我这里就不太清楚是我哪次的声明或者定义产生了这个错误。
虽然MakeCVNNAPI.cpp文件中定义过一次vector<RLU> RL ,但是在CVNNDeclar.h进行的只是预声明extern,那么就是我在MakeCVNN.h中的DLLIMPORT vector<RLU> RL;出问题了。但是,不是必须将传回的结果RL以DLLIMPORT的方式声明在 MakeCVNN.h文件中吗?
#include "stdafx.h"
#include "CVNNDeclar.h"
#define DLLEXPORT __declspec(dllexport)
#define DLLIMPORT __declspec(dllimport)DLLIMPORT vector<RLU> RL;//这里会出现重定义,因为这是在头文件里,你应该使用extern(可以用于导入)
extern "C" DLLEXPORT void MakeCVNN(char * data, char * obstacle, char * qs);