2013-07-10 3 views
1

현미경을 제어하기 위해 마이크로 관리자라고하는 오픈 소스 소프트웨어 용 장치 어댑터를 구축하려고했지만 현재 직면하고있는 몇 가지 문제가 있습니다. Micro-Manager의 오픈 소스 패키지에 이미있는 두 개의 파일 (헤더 하나와 다른 CPP).오류 C2491 : 헤더에서 선언되고 C++로 정의 된 함수

//MoudluleInterface.h 

#ifndef _MODULE_INTERFACE_H_ 
#define _MODULE_INTERFACE_H_ 

#ifdef WIN32 
#ifdef MODULE_EXPORTS 
    #define MODULE_API __declspec(dllexport) 
#else 
    #define MODULE_API __declspec(dllimport) 
#endif 

#else 
#define MODULE_API 
#endif 
#define MM_MODULE_ERR_OK 1000 
#define MM_MODULE_ERR_WRONG_INDEX 1001 
#define MM_MODULE_ERR_BUFFER_TOO_SMALL 1002 

/////////////////////////////////////////////////////////////////////////////// 
// header version 
// NOTE: If any of the exported module API calls changes, the interface version 
// must be incremented 
// new version 5 supports device discoverability 
#define MODULE_INTERFACE_VERSION 7 

#ifdef WIN32 
const char* const LIB_NAME_PREFIX = "mmgr_dal_"; 
#else 
const char* const LIB_NAME_PREFIX = "libmmgr_dal_"; 
#endif 

#include "MMDevice.h" 

/////////////////////////////////////////////////////////////////////////////// 
// Exported module interface 
/////////////////////////////////////////////////////////////////////////////// 
extern "C" { 
MODULE_API MM::Device* CreateDevice(const char* name); 
MODULE_API void DeleteDevice(MM::Device* pDevice); 
MODULE_API long GetModuleVersion(); 
MODULE_API long GetDeviceInterfaceVersion(); 
MODULE_API unsigned GetNumberOfDevices(); 
MODULE_API bool GetDeviceName(unsigned deviceIndex, char* name, unsigned  bufferLength); 
MODULE_API bool GetDeviceDescription(const char* deviceName, char* name, unsigned bufferLength); 

그리고 여기에 내가 대해 조사를했는데 (허용되지 같이 DllImport 함수의 정의)

 //ModuleInterface.cpp 
     #define _CRT_SECURE_NO_DEPRECATE 
     #include "ModuleInterface.h" 
     #include <vector> 
     #include <string> 

     typedef std::pair<std::string, std::string> DeviceInfo; 
     std::vector<DeviceInfo> g_availableDevices; 

     int FindDeviceIndex(const char* deviceName) 
    { 
    for (unsigned i=0; i<g_availableDevices.size(); i++) 
    if (g_availableDevices[i].first.compare(deviceName) == 0) 
    return i; 

    return -1; 
    } 

    MODULE_API long GetModuleVersion() 
{ 
return MODULE_INTERFACE_VERSION; 
} 

    MODULE_API long GetDeviceInterfaceVersion() 
{ 
return DEVICE_INTERFACE_VERSION; 
} 

MODULE_API unsigned GetNumberOfDevices() 
{ 
return (unsigned) g_availableDevices.size(); 
} 

MODULE_API bool GetDeviceName(unsigned deviceIndex, char* name, unsigned bufLen) 
{ 
if (deviceIndex >= g_availableDevices.size()) 
    return false; 

이제 문제는 나에게 오류 C2491을 준다 이러한 기능을 정의하는 CPP 파일의 일부 입니다 이 함수는 선언 할 때 함수가 정의 될 때 일반적으로 ModuleInterface.h에서 함수를 이미 정의한 다음 ModuleInterface.cpp에서 사용했지만 여전히 동일한 오류를 보여줍니다. 이 오류가 발생할 수있는 다른 방법이 있습니까? 아니면 코드에 문제가 있습니까?

답변

1

선언에서 MODULE_API 선언을 반복하지 않아도되므로 선언의 일부로 충분합니다. .cpp 파일에서 MODULE_API 사용을 제거하면 코드가 컴파일됩니다.